To add to Paul's reply:

Java and C# (AFAIK) don't actually copy objects: if you say "a = b" (where a and b have class type), then the object referred to by "a" has its reference count decremented, and the object referred to by "b"has its reference count incremented to reflect that it is now referred to by "a" as well. In C++, the same statement creates two independent copies of the same data - whatever data "a" originally contained is lost (overwritten). No reference counts involved. C++ doesn't do reference counting unless you implement it yourself. This is why copy constructors, copy assignment operators and destructors are so important - C++ makes you do your own resource management. Oh, and I should say that, IMHO although that may seem to be a disadvantage, it actually gives you a lot more flexibility than garbage collection once you're used to it.