W sumie jestem skłonny Ci uwierzyć bo piszesz z perspektywy osoby która zna wiele języków programowania i potrafisz to ocenić pod różnymi kątami.
Jednak aspekty które wymieniłeś, jak wiesz, są wadami lub zaletami w zależności od zastosowania.
Podział na headery rzeczywiście jest cholernie irytujący i czasami dużo trzeba krwi napsuć by wszystko działało tak jak trzeba... jednak, jeżeli widziałeś specyfikę nowego standardu to mają to zmienić... oby.
W tzw. "modern c++" już odchodzi się od makr na rzecz funkcji szablonowych czy deklaracji const.
Niezastąpione zastosowanie makr to m.in. header guardy, jednak jest to rzecz prosta i nie uciążliwa.
Semantyka wskaźników i referencji, owszem jest trudna, ale dla początkujących (mi osobiście zrozumienie działania wskaźników (oraz ich zastosowanie) przyszło z czasem, kiedy zacząłem programować obiektowo).
Nie odczułem by STL był kiepsko zorganizowany. Być może to dlatego, że nie programuję na takim stopniu zaawansowania jak Ty?
Wycieki pamięci jak wiesz można znacząco ograniczyć za pomocą smart pointerów, owszem mechanizm refleksji (chyba dobrze) Javy jest wygodniejszy bo nie zaprząta głowy programiście zarządzaniem pamięcią ale z drugiej strony daje to pewny narzut na pamięć jak i na czas obliczeń. Nowoczesne kompilatory javy pewnie robią robotę ale mimo wszystko nie może to być szybsze od wskaźników w c++ (przypuszczam, nie testowałem).
Kolejna sprawa jeśli idzie o pamięć to typy polimorficzne. W javie każdy typ z automatu jest polimorficzny co daje dwukrotny narzut pamięci w stosunku to typu niepolimorficznego.
W c++ masz wybór. Słowem kluczowym virtual możesz definiować typ polimorficzny lub nie.
Ja osobiście preferuję hierarchię klas opartą na modelu agregacji (bardziej naturalne i intuicyjne) aniżeli opartą na dziedziczeniu i dla mnie ważne jest rozgraniczenie na typy polimorficzne i niepolimorficzne bo przy rozbudowanych klasach daje to zauważalny narzut pamięci.
Kolejna sprawa to maszyna wirtualna javy. Kodu nie uruchomisz nigdzie poza nią. Owszem jest to wada dla jednych i nieoceniona zaleta dla drugich. Dla mnie jest to niestety wada, ponieważ do komunikacji ze "światem" trzeba używać osobnych bibliotek napisanych w innym języku, dobrze mówię (to są chyba wrappery czy jakoś tak)?
W sumie masz rację. Jeżeli ktoś chce po prostu "programować" i nie przejmować się niuansami to lepiej zacząć od javy. Jednak czy c++ może zrazić początkujących to bym tego nie powiedział. C++ oferuje naprawdę ogromną dowolność i elastyczność.
Nie wiem w jakim stopniu konkurencyjności stoi objective-c w stosunku do c++. Trochę irytuje mnie to, że język na który poświęciłem już trochę czasu (i pod który ustawiam sobie ścieżkę zawodową) jest uważany przez sporą rzeszę osób za po prostu chujowy. Do niskopoziomowych zastosowań są czyste C lub asm a do zabaw na wyższym poziomie mamy jave i c#. A sam c++ to takie cholera wie co... Podobno już odchodzi się od tego języka na rzecz objective-c, ale jak czasami przeglądam oferty pracy to znacznie więcej jest ofert dla programistów c++ aniżeli objective-c.
Osobiście raczej ciężko byłoby mi się przerzucić na jave czy c#.. już przywykłem do wskaźników, wycieków pamięci, operatorów new i delete.. na tyle, ze ciężko mi wyobrazić sobie programowanie bez tego
. Po prostu wszystko musi być zgrane na tip top, nie chcę by żaden bajt poszedł na zmarnowanie
To też trochę temat na inną rozmowę, ale takie pierdolenie od czasu do czasu nie zaszkodzi.
Jestem trochę zmęczony, przepraszam za błędy (jeżeli oczywiście jakie kolwiek pojawiły)