Even amongst the Indian IT outsourcing industry, they do not have a very good reputation and in the latest rankings by CIO.com, they were 7th out of 10.
Dear Lord! Who's 8, 9 and 10???
Who cares?
Image being one of only a few people to set foot on or even cirlce the Moon and being remembered for your race or sex.
Human?
C++ doesn't really have compile-time encapsulation
You mean BINARY encapsulation. C++ doesn't have an ABI, or strong guarantees about source-to-binary compatibility; never did.
C++ also doesn't have run-time encapsulation or really any serious run-time error checking that you don't do yourself
You're talking about bounds-checking and the like. That's not run-time encapsulation.
some people are working on problems that aren't performance-critical and would prefer a language that doesn't pound nails through our dicks. (if it doesn't have encapsulation, why do they call it "object oriented?")
C++ isn't a great APPLICATION language. Never was. But it beat the alternatives. Java arose as a 'modern COBOL' (essentially) which is one reason it's so widespread - most people build APPLICATIONS, they don't so SYSTEMS programming. Nowadays you have options, of which C++ is but one.
(if it doesn't have encapsulation, why do they call it "object oriented?")
Are you a Smalltalk developer? Clearly not, or you'd be railing instead of inquiring...
C++'s exception support is hilariously broken. 1) If you've allocated some memory for an object, and then you throw an exception, you don't have that pointer anymore
What are you smoking? What's allocated, the exception or the surrounding object? If the exception, why are you throwing something involving the heap? If the surrounding code, learn what try{} and catch{} are for.
implement garbage collection yourself; C++ weenies call this "RAII" and if they're really far down the rabbit hole they sometimes don't even realize that it's just them implementing shitty reference-counting garbage collection.
Wow. You're clearly not an experienced C++ programmer. * RAII means using constructors and (more importantly) destructors for auto-magic cleanup on exit of scope. Java can't do this due to lack of DETERMINISTIC destruction. C# can do it with Disposing. Python can (now, sorta) do this with 'with'. Other languages can do the idiom too. RAII != Garbage Collection. * reference-counting GC? Well, OK, if you say "refcnt=1". Kinda perverse way to put it.
2) You can't throw exceptions in destructors.
Yes. C++ supports EH, but has some weaknesses if you try to use it pervasively. The Standard C++ Library tries to compensate, but it's hard to live in a pure-EH C++ world (for non-trivial code). Shrug. Nothing's perfect. Which language would you hold up as the pinnacle of EH, and has no other compensating warts? Java? C#? Perl? Eiffel? Smalltalk? D?
3) In every major compiler I've used, exception handling support is implemented in such a way that it slows down every function call you make
EH blocks are cheap to construct (try), they're costly to use (catch). This is universally true of pretty much every language supporting EH. That's why you use EH for *exceptional* conditions and not normal control flow. If EH is slowing down every function call, you're using it wrong.
I mean you can't even get a goddamn stack trace out of them
You can. I've done it. But not with just the stock compiler; you need some platform-specific support. OTOH, you don't pay the perf overhead of tracking stack frames so you an provide a call stack, in case the developer wants to get at one.
You can throw arbitrary objects, but the catcher can't figure out what the hell the object is because of C++'s lack of reflection.
Ever hear of RTTI? dynamic_cast? You betray your ignorance.
C++, in an effort to be sort-of compatible with C (except where it's not compatible with C, which makes you wonder why they bothered in the first place)
You obviously are rather new the programming. C compatibility was (and is) important for C++ success, to provide a bridge for C developers and libraries to use C++ w/o throwing away every single piece of knowledge and code first. If that 'bridging' wasn't important we'd all be using Eiffel or Oberon or something more exotic. And C got quite a few things right; why should C++ discard them when it can embrace them.
So you have C++ templates, but you still need to deal with C macros.
They don't solve the same problems. Using one instead of the other is only partially successful.
You have std::vectors, but you still need to deal with arrays.
Because std:vector is so much more effective and can totally replace arrays... When was vector created? C++ successfully was in use before that. Do you know what C++98 is? Do you know why it was delayed from ~93? Do you know who Alex Stepanov is? Zortech C++? Glockenspiel? C++ with Classes? And even if you supplanted arrays with vectors, that may not bother you but the array bounds checking overhead is an issue for some. If that doesn't fit your needs that's fine, there's plenty of languages to choose from, please do so. But don't expect others to be satisfied with your more narrowly defined needs and acceptable tradeoffs.
You have std::string and char*, and neither is particularly good.
You won't get much argument from me on std::basestring (let's call a spade a spade - or do you have no need for Unicode?). I find several key design points and missing functionality (trim, anyone?) exceedingly annoying and confining. If I wanted a totally protected smothering environment I'd go use Java or something.
Making things even funnier, C++ doesn't like to use its new features and prefers the C stuff
So we should invalidate 30+ years of existing code and knowledge, because you want a different more mothering language? Yeah. That's a real popular approach to take. There are languages closer to your desired feature set. Use them if they better suit your needs and temperament.
the standard iostream is pants-on-head retarded
Not too much argument here. Better than pre-C++98, but. Java got it much righter. Of course, Java had the benefit of learning from C++ on this one. I'd be shocked if Java didn't do it better. As for printf, yeah, that's a shame. The type-safety is nice, as is the extensibility but the behavior and usability are (IMO) pretty poor compared to printf. P.S. You forgot to mention printf vs. cout in multi-threaded programs.
You send values like std::hex or std::setw(int) to set parameters, so when you grab a stream you don't really know what the fuck will happen.
I thought setw/etc only applied to the NEXT value, then got reset (which solves the stateful-what-is-the-state problem, at the cost of uglier syntax and usability).
The standard library is completely anemic.
I thought this was a focus for C++next. Bjarne has (in the past 10 years) lamented the lack of breadth of library behavior and wished 20-20 hindsight they'd done more. If that's the worst flaw it's a smashing success.
You can use...but which of the many, many mutually incompatible wrappers are you going to use? Is that wrapper still going to be maintained when you're working on your program a few years down the line?
So you want everything included in the language/standard library? Wow. That's hubris. Can you point to one language that does that, and is successful? Java? LOL. Just how many non-java.* packages does a non-trivial Java app use? Python? Not bad, given the breadth of the library (batteries included), but not quite complete. Improving constantly, but it wasn't long ago sqlite, etree and others were external libraries not included with the standard library.
The STL (and any other template-heavy code, particularly code that does a lot of operator overloading, too) also just loves to dump gigantic unintelligible multi-kilobyte error messages at the slightest provocation
This is a known weakness. Do you know what the ARM is? Do you know what Bjarne said about templates back then? It's been 25+ years and even he's still waiting. Shrug. Judicious use of templates works well. Deeply wallowing in them takes a certain level of committment, and acceptance of things like ugly error messages when things go really off track. What language has no like flaw?
it's not until you need to use it for a large codebase with lots of other people, some of whom have already moved on to other companies, that you realize what an unholy mess the language is.
LOL! Why do you think that's limited to c++? Ever picked up any large codebase you didn't write? Java? Especially throw in some Spring and Hibernate, if not EJB. Perl? Ever see a Ruby on Rails project? I can write shitty code in 30 languages. Apparently, so can many others... Writing functional, correct, performant, MAINTABLE code is HARD. Many lack the time or skill to do it. C++ is nowhere the worst offender. Quite the opposite. C++ is a tool. It can be quite powerful AND maintainable, in the right hands. Just because every 6 year old can't properly use a miter saw is no reason to say miter saws suck and no one should use them.
Shouldn't the copyright on something published in 1920 have expired by now?
Copyright expires?
Suburbia is where the developer bulldozes out the trees, then names the streets after them. -- Bill Vaughn