C++ warto inwestowac czas ?

0

Czesc :)

Ostatnio kodując trochę w Javie powróciłem znowuż do c++. Musze przyznać ze kodowanie w c++ sprawia mi dużo więcej przyjemności , przynajmniej na tym poziomie na którym potrafie kodowac . C++ jest dla mnie logiczniejszy i bardziej przejrzysty , po prostu lepiej się w tym środowisku czuje.

Rozne opinie widze na forach na temat c++. Jedni mowia ze nie uczy on jako tako programowania ? ( DLACZEGOZ NIE ?! ) , drudzy mowia ze jak kazdy jezyk daje porzadne podstawy jezeli wystarczajco sie w niego zaglebi.

Na ten moment sytuacja zarobkowa mnie nie interesuje bo studiuje. Wiec chcialbym w wolnym czasie po prostu zaglebiac sie ile to sie da w c++ i odlozyc inne jezyki na bok ewentualnie powrocic do nich pozniej. Dodam ze jestem na kierunku elektronika. I mysle ze wiecej C tam niz javy.

Jezeli warto , mozna prosic o jakies fajne ksiazki ?

0

Jedni mowia ze nie uczy on jako tako programowania ?

Bo po prostu go nie rozumieją. C++ daje duże możliwości, bardzo dobre podstawy. C++ nie jest językiem prostym takim jak Ruby, wymaga znacznego zaangażowania co pewnie wiesz jako, że już go znasz w miarę.

Przyszłościowo patrząc sam nie wiem, sam się zacząłem uczyć i mam cel doprowadzić to do porządnego stopnia. Uczę się go z pewnym celem zawodowym, bo inaczej nie byłoby sensu, a co najwyżej zgłębić jego podstawy może ciut więcej.

Co do książek jako, że jestem nowicjuszem kupiłem http://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,cppri6.htm z ciekawych lektur o których słyszałem mogę polecić jeszcze http://helion.pl/ksiazki/jezyk-c-kompendium-wiedzy-bjarne-stroustrup,jcppkw.htm

0

Odpowiedz sobie na pytanie co chcesz robić?
Lubisz kodzić w C++ - to pisz w nim. Książki? Nie wiem czy jest sens polecać jakieś książki skoro masa rzeczy jest w necie.
Pytanie jaki poziom wiedzy masz. Najlepiej zacząć tutaj: http://www.cplusplus.com/doc/tutorial/ i dużo pisać bo wtedy pojawiają się kolejne pytania, szukasz odpowiedzi i poszerzasz swoją wiedzę. Poza tym warto chyba uczyć się obecnej wersji języka więc C++11/14.
Co do książek, które warto polecić to tu masz rozpiskę: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list

4

Opinie typu "C++ nie uczy programowania" biorą się stąd, że C++ posiada wiele (często dublujących się) mechanizmów, które są specyficzne wyłącznie dla C++, albo nawet jeśli nie są specyficzne dla C++, to działają nieco inaczej niż się ogólnie przyjęło w większości innych języków. Poza tym posiada dość długą i bogatą historię, i przez to wiele jego cech powstało tylko po to aby naprawić błędy wprowadzone w poprzednich wersjach, albo aby zapewnić kompatybilność wsteczną z C.

Moim zdaniem, ucząc się C++ jako początkujący programista, poświęcisz dość dużo czasu na zrozumienie pewnych dziwactw C++, a relatywnie mało czasu na zdobywanie wiedzy, która się przyda w ogólnym programowaniu.

Żeby nie być gołosłownym:

  • undefined behaviour czychające na każdym kroku, czasem w bardzo zaskakujących miejscach, i to nawet jak się pisze wysokopoziomowo w stylu "modern" C++; stracisz ileś dni na szukanie, czemu gdzieś masz "segmentation fault", mimo że na pierwszy rzut oka wygląda ok
  • brak modułów, a w zamian archaiczny system nagłówków odziedziczony po C i w efekcie WTF w postaci składowych private klasy w plikach nagłówkowych i powolne czasy kompilacji (może dla małych programów nie ma tak dużego znaczenia - ale jednak utrudnia poruszanie się po projekcie)
  • kilka rodzajów rzutowania, z czego niektórych nie należy używać nigdy
  • dwa różne mechanizmy makr (makra z C i szablony) - obydwa całkiem potężne, ale niebędące częścią systemu typów, tylko oparte o "znajdź i zamień", przez to dość uciążliwe w użyciu i generujące błędy na kilkaset linii z błahego powodu
  • statyczny system typów, który nie potrafi reprezentować typów generycznych inaczej jak przez hack zwany szablonami (sprawdzanie typów jest przeprowadzane po rozwinięciu szablonów, czyli wtedy, gdy typy generyczne przestają istnieć)
  • czemu to nie działa: std::string x = "y" + "z" ;)
  • każda biblioteka ma własne stringi, bo te wbudowane prawie do niczego się nie nadają poza hello-world
  • ... podobnie zresztą jak strumienie
  • parę mechanizmów, które okazały się niezłe tylko na papierze, a w praktyce okazały się niewypałem: wielodziedziczenie, throw, export
  • brak ortogonalności wielu mechanizmów - możesz użyć mechanizmu A, możesz użyć pozornie niezwiązanego z A mechanizmu B, ale jak użyjesz obu, to masz nagle wielkie bum. Przykład: wyjątki i destruktory.
  • składnia, której w paru miejscach mógłby pozazdrościć Perl: np. uzycie [] do lambd i do tablic, gwiazdka z lewej/prawej strony (dla kogoś, kto pisze w C to niby łatwe, ale jak pamiętam 90% początkującym ta gwiazdka śni się po nocach), niejednoznaczność składni w paru miejscach.

Do tego dochodzi konieczność użerania się z narządziami takimi jak systemy do budowania projektu (make, autotools), IDE czy debuggery, które jednak dośc mocno odstają względem pod względem przyjazności tego co jest dostępne w nowocześniejszych językach.

http://yosefk.com/c++fqa/

Podsumowując: na pewno warto się uczyć C++, ale nie za wcześnie.

C++ daje duże możliwości, bardzo dobre podstawy

Tylko, że duże możliwości daje również 50 innych języków.
Dobre podstawy czego? Uczenie się podstaw C++ może dać Ci dobre podstawy... C++. I tylko tyle.
A jak będziesz programować w stylu "modern C++", to nawet C się nie nauczysz.

0

brak modułów, a w zamian archaiczny system nagłówków odziedziczony po C i w efekcie WTF w postaci składowych private klasy w plikach nagłówkowych i powolne czasy kompilacji (może dla małych programów nie ma tak dużego znaczenia - ale jednak utrudnia poruszanie się po projekcie)

Ja akurat lubię ten podział na header / cpp. Podział na interfejs i implementacje jest dla mnie wygodny.

Czas kompilacji boli, szczególnie z bibliotekami takimi jak boost ale są mechanizmy które pozwalają zminimalizować ten ból - forward declaration, PIMPL, czy precompiled header.

składnia, której w paru miejscach mógłby pozazdrościć Perl: np. uzycie [] do lambd i do tablic,

To Twoja opinia, mi bardzo podoba się obecna składnia lambd.

Do tego dochodzi konieczność użerania się z narządziami takimi jak systemy do budowania projektu (make, autotools), IDE czy debuggery, które jednak dośc mocno odstają względem pod względem przyjazności tego co jest dostępne w nowocześniejszych językach.

Fakt, w przypadku pracy z C++ "ekosystem" nie jest taki jednolity jak np w C# ale nie przesadzaj, już w tej chwili jest przynajmniej jedno IDE które dorównuje każdemu obecnemu na rynku - QtCreator. Sporo się w nim zmieniło w ciągu ostatnich kilku na plus oczywiście. A wiem co mówię bo używałem wcześniej "podobno" najlepszego IDE - Visual Studio i praca w obu jest dla mnie równie przyjemna.

Warto uczyć się C++ bo jest wykorzystywany praktycznie wszędzie - aplikacje biznesowe / desktopowe, urządzenia mobilne, systemy wbudowane.

Na plus dla C++ to istniejąca, ogromna baza bibliotek w tym chyba najważniejsze / najpopularniejsze to Boost i Qt.

Próg wejścia jest dużo większy niż w innych językach, nauka zajmuje dużo więcej czasu, ciężej znaleźć pierwszą prace. Język cały czas się rozwija, wychodzą kolejne standardy, są i pojawiają się nowe oferty pracy. Jak tylko lubisz C++ to warto porządnie się go nauczyć.

0

Ja akurat lubię ten podział na header / cpp. Podział na interfejs i implementacje jest dla mnie wygodny.

Ten podział na interfejs i implementację ma sens dla czystego C, w programowaniu strukturalnym, gdzie programy = struktury danych + algorytmy. Struktury do nagłówków, algorytmy do *.c. Eleganckie, proste i co najważniejsze szybko się kompiluje, bo nagłówki są proste.

Dla C++ używającego ostro szablonów tego sensu nie ma, bo i tak prawie wszystko ląduje w nagłówkach. A one wciągają inne nagłówki. I w typowym projekcie nagle się okazuje, że żeby skompilować 10 linijek cpp, kompilator musi wczytać 10000 linii z nagłówków.

Dla OOP też nie bardzo jest sens, bo część prywatna klasy nie powinna być częścią interfejsu. Zauważ, że w takiej Javie czy C# mogę dowolnie zmieniać zarówno sygnatury jak i treści metod prywatnych i jedyne co wymaga rekompilacji to plik, który zawierał zmienione definicje. Ba, mogę taki pojedynczy plik po skompilowaniu podmienić z poprzednim (binarnym) i kod będzie działał. Bo prywatne jest naprawdę prywatne, a nie "publiczne, ale niedostępne z zewnątrz".

PIMPL - dobrze, że to wyciągnąłeś - to jest właśnie świetny przykład wzorca, który istnieje tylko w C++ i tylko dlatego, aby obejść pewną ułomność języka. Uczenie się tego wzorca nie przyniesie żadnych korzyści jeśli chodzi o naukę programowania ogólnie.

Warto uczyć się C++ bo jest wykorzystywany praktycznie wszędzie - aplikacje biznesowe / desktopowe, urządzenia mobilne, systemy wbudowane.

Aplikacje biznesowe - niemal całkowicie wyparte przez Javę i C#, te które zostały to głównie jakieś legacy z lat 90-tych. Urządzenia mobilne - tylko w bardziej wymagających grach. Systemy wbudowane? C no i faktycznie trochę C++. Tylko ile jest takich firm, które to robią? Zwłaszcza w Polsce?

C++ jest nadal wykorzystywany i długo będzie, ale z tym "praktycznie wszędzie" to byłbym serio ostrożny.

0

PIMPL - dobrze, że to wyciągnąłeś - to jest właśnie świetny przykład wzorca, który istnieje tylko w C++ i tylko dlatego, aby obejść pewną ułomność języka. Uczenie się tego wzorca nie przyniesie żadnych korzyści jeśli chodzi o naukę programowania ogólnie.

Istnieje i możesz użyć tego wzorca jeśli potrzebujesz aby "prywatne było naprawdę prywatne", gdy potrzebujesz binarnej kompatybilności, szybszej kompilacji i kilku innych powodów. Ale dokłada to sporo pracy szczególnie gdy nie piszesz biblioteki tylko "zwykłą" aplikacje. Na plus to że jak to w C++ bywa - masz wybór. Nic nie jest Ci narzucane.

Aplikacje biznesowe - niemal całkowicie wyparte przez Javę i C#, te które zostały to głównie jakieś legacy z lat 90-tych. Urządzenia mobilne - tylko w bardziej wymagających grach. Systemy wbudowane? C no i faktycznie trochę C++. Tylko ile jest takich firm, które to robią? Zwłaszcza w Polsce?

Nie znam całego rynku w Polsce ale nie zgodzę się z tym że to co zostało to "głównie legacy z lat 90-tych".
Trzeba by jeszcze zdefiniować "aplikacje biznesowe" ale jeśli uznamy je za "aplikacje desktop z GUI i bazą danych" które robią mniej lub bardziej ważne rzeczy to tego typu aplikacje ciągle są pisane w C++ głównie razem z Qt.
My w firmie takie właśnie piszemy. Ofert pracy choćby z tego portalu dla programistów C++ jest nadal sporo. Zerknąłem na szybko to na pierwszej stronie chyba 4 oferty oczekiwały znajomości właśnie Qt więc można przypuszczać że chodzi o jakieś GUI a jak tak to znowu można przypuszczać że to jakiś desktop chociaż może być inaczej. W każdym razie u nas i w kilku "znajomych" firmach kombajn C++/Qt sprawdził się w boju i z tego co wiem to na razie nie ma planów by porzucać te narzędzia na rzecz Javy ( bo to głównie appki na linuksa ).

Co nie zmienia faktu że znacznie bardziej popularne są tak jak powiedziałeś Java / C# ( którego też używamy ).

0

Nie mogę umieszczać komentarzy więc tutaj.

ok, zgoda, desktopowe GUI to wyjątek - tu się C++ trzyma jeszcze całkiem mocno, ale z tym "wszędzie" to też bym polemizował. C# na desktopie Windows też jest bardzo popularny.

@Krolik Zgadzam się z Tobą, nawet powiedziałbym że jeżeli chodzi o aplikacje desktop na Windows to tutaj zdecydowanie bardziej popularny / częściej wybierany jest właśnie C#.

Natomiast Java wydaje mi się przegrywa gdy w grę wchodzą aplikacje wieloplatformowe. Bo przynajmniej w moim otoczeniu to działa tak że C# jak aplikacja windows-only, C++/Qt reszta.

Z ciekawości - gdzie jest ta najpopularniejsza w tej chwili Java? Web?

0

No właśnie, jak koledzy napisali C++ trzeba się uczyć nie "gołego" tylko z konkretną biblioteką. Ja polecam QT, możesz w nim robić aplikacje desktopowe, mobilne i embedded.

1 użytkowników online, w tym zalogowanych: 0, gości: 1