Biorąc pod uwagę C ++ '11 został zatwierdzony, czy to się zmienia, jak początkujący C ++ uczy się języka? [Zamknięte]

21

Chciałem nauczyć się C ++ na jakiś czas i wziąłem programowanie komputerowe AP w liceum (w czasach, gdy był to C ++, a nie Java). Lubię C i po prostu nie znalazłem czasu na naukę C ++, albo po prostu powrócę do C #, gdzie jestem znacznie bardziej produktywny.

Moje pytanie brzmi: biorąc pod uwagę, że C ++ '11 zostało zatwierdzone (choć wiem, że nie jest w pełni wdrożone), czy to zmienia sposób, w jaki powinienem podejść do nauki C ++? Posiadam C ++: The Complete Reference autorstwa Herb Schildt, który pochodzi z 1998 roku. Czy nowo zatwierdzony standard sprawia, że ​​uczenie się z takich książek jest mniej ważne niż niektóre nowsze samouczki / książki zawierające elementy ze standardu? Czy korzystanie ze starszych książek przynosi jakieś korzyści?

Jetti
źródło
9
Nie. Schildt. Nie mogę mówić o jakości jego materiałów w C ++, ale jego materiały w C były przez długi czas niespełniające standardów (nawet najnowsza edycja C: TCR wciąż ma kilka nietrywialnych błędów). Polecam poszukać bardziej aktualnej pracy innego autora.
John Bode
C ++ 11 nie zmienił podstaw języka C ++, którego należy się nauczyć, aby zrobić wszystko, co zostało wprowadzone w ostatniej wersji i nie istnieje w poprzedniej wersji C ++.
Ramhound
11
Nigdy nie ufaj książce Herb Schildt. Naprawdę, podczas gdy większość książek w C ++ to złe książki (i nie odnoszę się tutaj do kwestii stylistycznych, ale rażące błędy merytoryczne i promowanie stylów programowania dobrze znanych z tego, że prowadzą do błędów w kodzie), książki Schildta były wyjątkowo złe, jego imię stało się niejako memem.
sbi
4
@Ramhound: Nie zgadzam się. Gdyby to było prawdą, wszyscy nadal uczilibyśmy się najpierw ręcznego zarządzania zasobami, a dopiero potem bezpieczniejszych sposobów wykonywania zasobów dynamicznych. Na szczęście zmienia się to (powoli). Nowe możliwości, nawet jeśli są „tylko” w bibliotece, wymagają nowych idiomów. Jeśli zaczynasz od języka, po co najpierw uczyć się starszych idiomów, a potem trzeba je oduczyć?
sbi

Odpowiedzi:

16

Absolutnie. W dzisiejszych czasach trzy rzeczy, które zwykle znajdują się w lekcji 2, powinny poruszać się znacznie, znacznie później:

  • łańcuchy jako tablice char *, metody strlen, strxxx i tak dalej
  • tablice w ogóle i arytmetyka wskaźników
  • usuń to, co nowe, usuń [] to, co nowe [], a nawet destruktory

Te rzeczy, które zwykle znajdują się w lekcji 99, powinny poruszać się znacznie wcześniej

  • szablony jako rzeczy do użycia (pisać, nie tyle)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, iteratory, inne kolekcje

Surowy wskaźnik Evey powinien zostać natychmiast przekazany do inteligentnego opakowania wskaźnika (zacznę od udostępnionego, a później uważam go za wyjątkowy, ponieważ wymaga wyjaśnienia referencji std :: move i rvalue). Dzięki temu nauka języka C ++ będzie przypominać naukę języka Java lub C #, w którym uczysz się biblioteki w tym samym czasie co język. Zabierze też wiele pracy z pamięcią i sprawi, że ludzie będą mniej zaniepokojeni gotchami.

Pracowałbym również nad lambdami w obrazie, gdy po raz pierwszy chcieliśmy iterować kolekcję i zrobić coś z każdym elementem.

Uwaga: Piszę teraz kurs C ++ dla Pluralsight i używam tego podejścia. Ostatnim modułem jest „zrozumienie kodu innych ludzi” i tutaj umieszczę mylące rzeczy, takie jak ciągi char *, ręczne zarządzanie pamięcią, arytmetyka wskaźników i tak dalej.

Aktualizacja: kilka osób zapytało, dlaczego istnienie C ++ 0x inspiruje do nauczania rzeczy, których można by nauczyć z C ++ 03. Myślę, że to wiele rzeczy:

  • naprawdę inteligentne wskaźniki, które są przyjazne dla kolekcji, eliminują potrzebę takich rzeczy jak „tablica wskaźników pracowników”, które powodowały, że zawsze wracaliśmy do nowego / usuwania, arytmetyki wskaźników itp.
  • auto usuwa ból deklaracji iteratora
  • lambdowie sprawiają, że przepowiadanie jest czymś, co zrobiłby zwykły człowiek
  • nawet coś tak trywialnego jak parsowanie >>poprawnie eliminuje gotcha, która byłaby przy deklarowaniu niektórych szablonów szablonów
  • i tak dalej

Z mojego punktu widzenia mogliśmy zmienić pewne rzeczy w sposobie nauczania C ++ jakiś czas temu, ale niektórzy z nas powstrzymywali się, ponieważ nadal potrzebowaliśmy starej szkoły na wypadek awarii lub ponieważ nauczanie jej wymagało dużo tajemnej wiedzy.

Kate Gregory
źródło
3
Dlaczego uważasz, że ręcznego zarządzania pamięcią należy się uczyć później? Uważam, że ważne jest, aby wiedzieć i daje więcej uznania podczas nauki inteligentnych wskaźników. Musiałem nauczyć się zarządzania pamięcią (i tablic char) w C i dzięki temu doceniłem RAII i std :: string o wiele bardziej niż sądzę, że zrobiłbym to, gdybym nie musiał tego robić.
Jetti,
1
Twoje przykłady dotyczą głównie C ++ 98 w porównaniu ze standardowym C ++, a nie C ++ 03 vs. C ++ 11. Podejrzewam, że podana lambda std::for_each()będzie znacznie bardziej popularna niż kiedyś, autobędzie bardzo ważna, a nowa składnia deklaracji funkcji (w połączeniu z decltype) będzie często używana w kodzie szablonu. Są to rzeczy, których nie uczy obecna książka C ++. Ale tak, ogólnie zgadzam się z tobą ( +1). Kiedy zacząłem prowadzić kursy C ++, zacząłem od Accelerated C ++ i chociaż mój kurs zaczął coraz bardziej się od niego odchylać, nadal jest zgodny z podstawową zasadą.
sbi
3
@Jetti: Rzadko wykonuję ręczne zarządzanie zasobami, a jeśli tak, to do wdrażania klas RAII. Korzystam jednak z wielu z tych klas. Zgodnie z tym korzystanie z RAII wydaje się ważniejsze niż postępowanie z surowymi zasobami i dlatego powinno się tego uczyć wcześniej, z większym naciskiem.
sbi
1
@sbi: Muszę się z tobą zgodzić - większość z tych przykładów wygląda jak Modern C ++ 101 z 2006 roku, a nie nic nowego w C ++ 11.
DeadMG
2
@Jetti: Najważniejszym krokiem w kierunku opanowania C ++ jest poznanie wszystkich sposobów unikania ręcznego zarządzania pamięcią. Jest to absolutnie coś, czego należy nauczyć „później”, gdy tylko dowiesz się, jak daleko można posunąć się przez „automatyczne” zarządzanie pamięcią.
czerwiec
9

Prawie tak. Prostym faktem jest to, że w C ++ 98 i 03 wiele dobrych praktyk było zasadniczo bezużytecznych z powodu niskiej jakości obsługi języka np. W programowaniu funkcjonalnym. Teraz, gdy lambdy istnieją i działają, ludzie akceptują interfejsy funkcjonalne o wiele lepiej niż kiedyś, a ogólne programowanie jest jeszcze silniejsze niż wcześniej.

W 1998 r. Ludzie dopiero zaczynali odkrywać, jak pisać wysokiej jakości, bezpieczny i szybki kod za pomocą C ++, a dużo kodu brzmiało „C było klasami”. W C ++ 11 jest bardzo różna - idiomy takie jak kopiowanie i zamiana oraz Reguła Trzech (obecnie Pięć) są dobrze znane i zdefiniowane, a wiele innych rodzajów zarządzania zasobami stało się Standardowymi, takimi jak shared_ptri unique_ptrtam, gdzie poprzednie Normy po prostu je opuściły jak rozwarte dziury.

Możesz zobaczyć to pytanie, aby uzyskać doskonałą listę materiałów referencyjnych w C ++.

DeadMG
źródło
1
Właściwie początek końca „C z zajęciami” umieściłem kilka lat wcześniej niż w 1998 r., Ale generalnie masz rację i nie targowałbym się przez pół dekady. +1ode mnie.
sbi
4

Nie znam konkretnej książki, o której wspominasz. Ale ogólnie można powiedzieć, że wszystkie podstawowe informacje o składni C ++, typach danych i OOP są nadal aktualne. To samo powinno dotyczyć bibliotek STL wymienionych w większości książek dla początkujących.

Chociaż książka tak stara, jak z 1998 roku mogła przegapić kilka aktualizacji i zmian w stylu programowania C ++, które gromadziły się w społeczności przez lata. Poszukałbym nieco więcej aktualnych zasobów. Jest więcej niż wystarczająca liczba bezpłatnych samouczków online i dokumentów, które powinny zapewnić dobry początek. Niektóre z nich mogą nawet wspomnieć o C ++ 0x.

C ++ 0x na pewno wiele zmieni w kwestii tego, jak programiści widzą i używają języka w przyszłości. Miałoby to jednak wpływ na bardziej złożone projekty, w których nowe funkcje zaczynają mieć sens. Dla początkującego nie powinno to mieć znaczenia i możesz skoncentrować się na opanowaniu istniejących koncepcji, to już wystarczy, aby się uczyć. Na przykład większość książek dla początkujących nie zagłębia się w szablony, więc nowe szablony variadic nie są już tym, co musisz wiedzieć.

Może rzucisz okiem na listę zmian . Przynajmniej kilka koncepcji, takich jak zakres oparty na pętlach , najprawdopodobniej pojawi się w nowych samouczkach nawet dla początkujących. Warto więc rzucić okiem.

Thorsten Müller
źródło
Dzięki! Czy zdarza ci się znać jakieś przyzwoite zasoby online lub książki?
Jetti,
2
Nie, strona cplusplus jest często wymieniana jako zasób, który nigdy nie powinien być nigdy kierowany do nikogo, kto chciałby napisać dobry kod.
DeadMG
@DeadMG Czy masz alternatywną stronę internetową?
TheLQ
@TheLQ: Dostaniesz się dalej z referencją MSDN lub cprogramming.com.
DeadMG
@Jetti: Nie znam żadnych materiałów do używania C ++ 11 do nauczania C ++. Wszystko, co widziałem, uczy C ++ 11 na C ++ 03. Do nauki tego ostatniego patrz stackoverflow.com/questions/388242/... .
sbi
3

Oczywiście, jeśli chodzi o wszystko, co związane z technologią, być na bieżąco z najnowszymi materiałami jest zawsze sprytnym posunięciem, jednak zmiany wprowadzone w C ++ 11 nie mają na celu wstrząsania łodzią. Jeśli jesteś nowy w C ++ (lub ogólnie programowaniu), nie martwię się o to.

Dodatkowo, jeśli jesteś profesjonalnym programistą, możesz założyć się, że będziesz pracował nad kodem innej osoby w przyszłości, więc zawsze warto zrozumieć sposób działania rzeczy, nawet jeśli jest to przestarzała technika w praktyce.

Lew
źródło
Dzięki za odpowiedź, pomyślałem, że przynajmniej pomoże mi to w sprawdzeniu starego kodu podczas korzystania ze starego zasobu.
Jetti
W jaki sposób lambda autoi wykonywanie funkcji asynchronicznych może zrobić coś innego niż „wstrząsnąć łodzią”?
sbi
1
Twierdzę, że istnieje różnica między wprowadzaniem nowych narzędzi a szeroką zmianą filozofii projektowania (jak na przykład w przypadku PHP)
leo
1
@leo: Nie zgadzam się. Wprowadzenie STL, inteligentnych wskaźników i bogatych szablonów całkowicie zmieniło filozofię projektowania głównego nurtu w C ++. Prawie każda biblioteka boost jest zupełnie inna niż przeciętna biblioteka C ++ z lat 90.
sbi