DISCLAIMER:
litb has made some very good points in the comments to this answer. C++ should not be compared to python or C#. They're targeted at different areas of work. C++ is very well suited for the things it is used for. C# is very well suited for the things that is used for. Neither language can be considered "obsolete" or "inefficient" at the things they're meant to do.
However, people who make statements like "C++ is obsolete and inefficient" usually try to make this comparison, to prove that C++ is not suitable for modern applications development. As litb said, this isn't a very meaningful comparison, but people still try to make it. So this post will do the same, to look at how C++ compares to languages like Java, C# or Python. Modern high-level RAD-like languages on their own home turf. In other areas (systems programming, low-level stuff on embedded devices and so on), C++ stands practically unrivalled (well, C and C++ does), there can be no doubt of that. But for high level business programming, C++ lacks a lot of niceties that other languages provide.
The problem is that nearly everything is a pitfall. It's a very versatile and powerful language, but it also lets you shoot yourself in the foot in hundreds of subtle ways that more "modern" languages don't allow.
About being outdated, the language lacks a ton of modern facilities. Look at the .NET class library, or Python's standard library. Both offer a huge set of functionality for pretty much anything you'd ever need.
C++ has.... A few streams and a few container classes. (Yes, that's a bit of an exaggeration) Other languages have garbage collection to free the developer from worrying about memory management, C++ doesn't. So in many ways, C++ is outdated. It's missing a lot of tools that more modern languages have. But of course not in every way, and there are areas where C++ is the best tool we have.
C++ being stupid? Most definitely. There are a couple of notable blunders in the standard, such as std::vector<bool>
doesn't behave as a vector, the export template keyword that virtually no compiler supports and a few others. The syntax is so complicated as to be almost impossible for a compiler to parse. Compile-times can grow to be huge because of this. The compilation model is nothing short of archaic (header files? Come on, we don't live in the 70's)But more importantly, writing correct C++ code is just ridiculously hard, because many instances of things that look harmless and compile without a warning actually rely on undefined behavior. The following are all examples of undefined behavior. They compile just fine, and they might usually work, but they may also format your harddrive, set fire to your computer, print all your porn to the office printer, or crash the program:
int* p = new int[10];
int* p0
int* p0 = p + 11; // undefined behavior, pointer out of range
int* p1 = p - 1; // Undefined behavior, as above
int i = 0;
cout << i++ << ++i << endl; // undefined behavior, may not modify variable multiple times between the same sequence points
cout << reinterpret_cast<float*>(p); // The result of the cast is unspecified *except* tht if you cast it back to int*, you get the original value
const int c = 42;
const int& r = c;
const_cast<int&>(c) = 43; // undefined behavior // casting away constness from a variable that was initially const is undefined.
memcpy(p, p+1, 9); // undefined behavior, memcpy between overlapping memory
And of course many many more (and much more subtle) issues exist.
As for being inefficient, people often say that C++ is extremely efficient. And it is. I can't think of a better language for high-performance code. It beats C in many cases, and while Fortran may be a bit faster for purely numerical tasks, that gap has almost been eliminated by clever use of template metaprogramming and expression templates. C++ is damn fast. But again, only if you use it correctly. It is very easy to write inefficient C++ code, whereas something like C# is reasonably efficient no matter what you throw at it. To illustrate, check out this series of blog posts:
http://blogs.msdn.com/ricom/archive/2005/05/10/performance-quiz-6-chinese-english-dictionary-reader.aspx
Two high-profile Microsoft bloggers competing to write the fastest version of a simple program, in C++ and C# respectively. The C++ version ultimately wins, but only after a huge amount of extra work, and a few extra bug creeping in. In almost every iteration until then, C# keeps pace easily. Apart from that, it's an enlightening and entertaining read. Check it out.
Anyway, by asking what the pitfalls of C++ are, you're really looking at it the wrong way. By default, assume everything in C++ is a pitfall. Only trust code that has been verified against the standard. And of course, that makes it virtually impossible to trust your code if you're not already a C++ expert. ;)
The best advice I can give to avoid the pitfalls is to really try to learn the language. Read the C++ questions here on SE, get a copy of the standard (and get some practice in looking things up in it. It's not an easy read), buy a book like the annotated reference and so on.
And no, if anything, being a (good) C++ programmer might make you look impressive in the eyes of others, simply because getting good at C++ is a huge undertaking.
Overall, there are good reasons why C++ can be considered all these things you mentioned. But not in every case, and overall, the language has some unique strengths that no other language has so far duplicated.
Edit
Oops, looks like I angered the One-True-Language Brigade. Perhaps you should actually read my answer before saying that "virtually nothing in it is correct".
All I do is list a bunch of facts. The C++ standard library is missing many everyday features that .NET provides. Where's my threading library? Sockets? Regex?
And the things I listed are undefined behavior. Rico Mariani and Raymond Chen are high profile MS bloggers, and Mariani in particular is one of MS's performance gurus. And they did make a series of blog posts demonstrating the relative performance of C++ and C#, and the outcome was what I said. Those things are simple facts.
And if you don't think vector<bool>
is stupid, I'd really like to hear your reasoning.
I'm sorry if I angered anyone who only knows one language, and feels that therefore it must be perfect. But C++ is not perfect. I like the language, but I don't have any illusions that it's perfect, or that it doesn't lack a lot of modern conveniences.