> This is the first time I've ever heard someone say C++ is easy to learn.
C++ is easy to teach and easy to learn. Much easier than Java, for example. But I should stress that I mean 'modern C++'. Yes, technically, all C code is valid C++ code. But modern C++ has replacements for pretty much every C feature, especially the hard to teach stuff from C. A good teacher of introductory programming will teach C++ and will not teach C. For example, raw pointers are just obsolete now. In fact, you could teach a lot of introductory programming without any pointers or references or anything else that gives magical "action-at-a-distance" properties.
I've had great fun with friends, who are trying to get into programming, by confusing them with Java (and C). An int is passed by value in Java. But if you have an Address structure in Java, changes made in a function are magically visible outside. There is no easy way to force by-value passing in Java. Finally, there is a third kind of behaviour in Java. When you pass a String, you basically get value semantics instead (because you do s = "updated"; instead of s.assign("updated")). (Not a criticism of Java only, the same problems occur in C. "I though you said int arrays are (kinda) passed by reference thanks to pointer decay, so why did my code char_ptr = "updated" not cause the change to be visible in the parent function?")
Frankly, I think it's undignified that teachers are bogged down trying to explain this nonsense at the very earliest stages of teaching programming. It's already difficult enough trying to explain that parameter names in functions don't really mean anything but are merely placeholders for "first argument", "second argument", .... If a function parameter has the same name as the local variable in the parent function that's passed to it, then that is just a coincidence basically. It's difficult to have to say "well, sometimes the effects are visible outside the function, so I guess the 'outside' name can appear to be meaningful".
In the early stages of teaching, it's best to be able to say that a function just takes the values and is a black box that gives you a new answer. In C++, everything is passed by value by default, and returned by value. That's really consistent, and easy to teach. You can teach a lot of introductory programming with value semantics, writing some fun programs. Best of all, there are none of the "magical" side-effects of pointers/references to confuse the student. Every desired side effect must be explicitly done, perhaps printing of output or via return values.
When the programmer wants reference semantics in C++, they can explictly use C++ references to get them. The teacher can introduce them when the class is ready, rather than being forced to introduce them too early, as in Java or C.
Everything is, by default, passed by value in C++. And anything can be passed by reference when requested. Two kinds of passing, under the explicit control of the student. But Java basically has three kinds of passing (primitives, classes, and the String-like behaviour that's kinda like a primitive but not really). Why should we have to explain stacks and heaps and memory layouts at such an early stage?
And C++ developers never have to think about allocation and deallocation. Nor about pointers. Nor about action-at-a-distance. A vector of ints is passed the same way as an int is. The standard implementations of all the containers just work, on any type and by-value. The student can declare a class struct Person { string name, int date_of_birth }; and can be confident that everything will be allocated and deallocated automatically as need.