Jumping in here. Because C++ is most certainly the most misused language ever created.

When not to use C++:

1) You need to do object oriented programming.
2) You need to have a UI.
3) You need to write business logic.
4) You have a single programmer that doesn't genuflect when you say "Scott Meyer".
5) You don't need high efficiency.
6) Your project will grow to more than 5 people.

When to use it:

1) You need abstract data types.
2) You completely understand your compiler.
3) You already have a copy of Purify.
4) You have fairly high (but not maximal - they were maximal you'd use C or asm) efficiency requirements.

C++ is the worst OO language ever written. It has no interesting meta information in the runtime - the compiler throws it all away. This makes binding to GUI libraries a huge PITA. It makes binding to database records a huge PITA. It forces ORB vendors to do horrific code generation to put the missing meta info back into the runtime.

C++ lacks clarity on whether something is an abstract data type or an object. (Hint - ADTs don't get allocated in the heap, they live on the stack - you override operators for them and you pass them by reference - basically you're extending the language when you write adts - this can be useful - they never have virtual functions and you reuse logic via code generation - you know templates).

Class support is weak. The object runtime model (vtables) is shit. The existence of the virtual keyword is unfortunate - because when you're doing classes you really want everything to be virtual. C++ is the only language with this stupid idea and its a huge source of bugs - because the compiler doesn't always catch it and its very possible to have a system that produces incorrect results because you tried to override a non-virtual method. Inconsistent builds can crop up or you can get a library where the original developer didn't think to declare a method virtual but you want to override it - but you can't. There's no interface for extending or fiddling or even accessing the vtable. There's no way to lookup a method by name. There are 5 kinds of cast operators - 4 of them safe and intended to give you a little bit of help with compensating for the lack of useful meta info.

If you have strict memory requirements - C++ is not for you. Given the existence of templates and all of the compiler's gratuitous writing of methods for you (you know the big 4), its pretty much impossible to tell how big your program is likely to be (and its usually a lot bigger than most people think). In fact, a tiny change to a program can make a huge difference in its efficiency. This is because of the really stupid policy of automatic type conversions.

I personally got tired of the testosterone laden environment on C++ projects. Really smart programmers are attracted to C++ but its not because its a good language, but because its both a huge intellectual challenge for them and makes them elite if they can figure it out.

I could go on for hours - but these are a good summary of it. If most people write shitty programs in a languge - the language must have some problems.