The Lounge is rated Safe For Work. If you're about to post something inappropriate for a shared office environment, then don't post it. No ads, no abuse, and no programming questions. Trolling, (political, climate, religious or whatever) will result in your account being removed.
Given my daughter's experience with such courses, their 'textbook' is usually a class guide written as a master's thesis project by the graduate assistant teaching the class. These are uniformly awful, poorly written, and of low technical quality.
I'll recommend this Pluralsight course by Kate Gregory - more because I've seen extracts of this course and the philosophy behind it (teach C++, not 'C with a bit of ++'). And as Pluralsight do a free trial, your daughter can try it for nothing.
Who is this course for?
This course is aimed at those who have never programmed before.
What will I learn in this course?
Learn how to get the tools to develop in C++ and basics like building and running an application, then discover how to use classes from the C++ Standard Library and how to write and use your own functions and classes.
What prerequisites do I need?
Before beginning the course, you should be familiar with editing text files on your operating system and that's it.
What software is required?
There are text editors that come with your operating system, and then you need a compiler and a linker, and they very often come together.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
I wrote a book with two other authors called The C++ Workbench, which teaches C++. It doesn't teach all of C++, but focuses on the fundamentals. One feature is that it uses online C++ compilers that run in your browser so learning is as frictionless as possible. I'd actually be interested to learn if people like the approach in this book.
If you're saying she's taking a course where she needs to KNOW C++ but it isn't being taught in the course, then I would recommend taking a different course, or taking a C++ course first. Trying to learn C++ at the same time you're supposed to be using it in a course is a losing proposition, especially if she has no experience programming.
I read the list of reccomendations and did not see this one. "C++ How To Program: Introducing Object-Oriented Design with the UML" by Deitel & Deitel. Easy to read, well organized and covers the things likely to be used in basic object oriented C++ programming. Others mentioned that I would second are "Effective C++", PluralSight training and "Thinking in C++", although the last one is rather basic.
Having learned it this way, I always recommend Stroustrup's "C++ Programming Language". Read it cover to cover. Yes it will take a while, but its worth it. Then after perhaps a year of C++ experience, pick up Scott Meyer's "Effective C++", both editions. And/or his more recent variants of the same thing.
C++ takes a long time to learn to use properly. I've been coding in C++ nearly 30 years now, and I'm still learning stuff. Though I'd like to think I'm and effective C++ coder
I don't understand the snarky comments one sees about Java.
I am well versed in programming both in C# (Visual Studio 2019) and JavaFx (IntelliJ IDE). I enjoy both equally. There must be something wrong with me!
All programming languages are just variations on the theme we know as "assembly language".
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
In (very) special cases: Sure. In those cases, you might as well go to assembly language.
I learned 30+ years ago that trying to outsmart an optimizing compiler is futile. In my student days, we thought it crazy to write an OS in a "high" level language - but Unix did succeed, and performance was not an issue. So we abandoned assembly. Not entirely; there are cases for assembly because that is the only possible way to get access to certain hardware functions. But going assembly for performance reasons has no place in the third millennium.
Today, the same goes for memory. It is almost as difficult to outsmart automatic memory management by "clever" use of malloc/free as to outsmart a compiler - in particular because you have no insight in actual memory fragmentation. The risk of memory leaks is much larger; too many programmers do not master their own memory use as well as they believe (or, they are not enforcing the programming discipline as they should).
Again: There are (very) extreme cases where the cost of garbage collection is unacceptable. Usually, memory fragmentation is then unacceptable as well. So you manage your objects e.g. in a static array, dimensioned for a worst case. (I was programming one such C solution - malloc was not accepted by our coding standards. C++ new would have been rejected as well, so the case for C++ was not very strong.)
Analogy: When I talk with extreme HiFi buffs, I must admit that 24 bit samples at 96 kHz does have its place, in a professional studio where a sound recording may go through many generations of various processing, mixing etc. for an end result of unknown sample width and frequency. But that is is the studio. It doesn't mean that the music I listen to on my stereo benefits from being in 96/24 format.
Similarly: If you write a physical level driver for a 10 Gbps network interface, you probably cannot tolerate GC delays. But for 99.999% of all code written, GC without memory leaks is a lot better than dubious "private" memory management.
Special cases or not, there's no way I'd go to assembler and give up all the things that an OO language like C++ provides. And the special cases I'm thinking of aren't a question of trying to outsmart anything.
One of them, in serious production code, was morphing an object to a sibling class in the inheritance hierarchy by changing its vptr. The objects' memory came from a pool of blocks, not the heap, so objects from both classes fit into the same block. No deep copying, no worries about stale pointers to the object, just abracadabra, and its behavior is now what's needed.