C ++ dla programistów C #

24

Znam język C # dość dobrze (samoukiem, niestety) i potrzebuję programowania w C ++ dla aplikacji Windows. Byłem w stanie znaleźć mnóstwo informacji dla programistów C ++ uczących się języka C #, ale nie byłem w stanie znaleźć dużo na temat uczenia się języka C ++, kiedy już znasz język C #. Czy ktoś spotkał się z dobrym podsumowaniem podstaw?

MSDN ma porównanie, ale nie jest bardzo szczegółowe.

Mogę poskładać kilka źródeł, ale zorientowałem się, że coś tam jest - po prostu nie mogę tego znaleźć. Dzięki za pomoc.

Mark Williams
źródło
27
Dlaczego „niestety”? Nie poddawaj się w ten sposób. Nie znam programisty C #, który nie jest samoukiem. Wielu z nich to niesamowici programiści.
Steven Evers
6
@SnOrfus - głównie dlatego, że środowiska akademickie unikają go z irracjonalnych powodów pseudo-politycznych.
Rei Miyasaka,
5
Moje pierwsze słowo rady to nie próbuj uczyć się C ++ w kontekście C #. Ponieważ C # nie jest C ++, a C ++ nie jest C #. To może być głupie stwierdzenie, ale C # utrudnia błędne używanie wskaźników, a bardzo łatwo jest je źle obsługiwać w C ++, nawet przy pomocy narzędzi, które sprawiają, że jest to naprawdę łatwe. Dodam, że jest wiele rzeczy, które oba języki mają wspólną. Zasadniczo to tak, jakby jabłko i pomarańcza były uprawiane na drzewie i miały nasiona, a zatem są owocami.
Ramhound,
2
@ReiMiyasaka, podobnie jak deweloperzy C # patrzą na VB .NET.
Kyralessa
1
@ Kyralessa Które jest również trochę niefortunne. Myślę, że to nie tyle kwestia polityczna, co protekcjonalność w stosunku do demografii VB.NET - ponieważ większość wczesnych użytkowników C # ma doświadczenie w C / C ++. Jednak moja szkoła używała VB.NET do kursów dla początkujących. Wydaje się, że uważają, że VB.NET jest zabawką i dlatego nie powinno być tak korupcyjne dla umysłów uczniów, jak C #.
Rei Miyasaka

Odpowiedzi:

10

Wątek w języku C ++ dla programistów Java jest bardzo podobny i powinien być przydatny, zwłaszcza post Mark Byer:

Przeczytaj te książki:

Prawdopodobnie najważniejszą rzeczą, o której należy pamiętać, jest zrozumienie różnicy w technikach zarządzania pamięcią między C # / Java i C ++ .

Jeden z moich profesorów pochodził z języka Java i uczył wstępnego kursu C ++, myśląc, że to będzie ciasto. Nic, co wyjaśnił, nie miało dla nikogo sensu. Wszędzie miał przecieki pamięci. Jego wskaźnik arytmetyki był okropny. Nigdy nie dotarł do części programu OOP (dzięki Bogu). Praktycznie nic, co pokazał, nie skompilowałoby się. Nie rozumiał, że char[]potrzebował wartownika \0. Nie bądź taki jak on.

Rei Miyasaka
źródło
4
Szkoda tylko, że nikt w C ++ używa char[]wtedy , prawda?
DeadMG
5
@DeadMG Nie do końca rozumiem twój punkt widzenia. To, że char[]rzadko jest używane w C ++, nie oznacza, że ​​nie jest nauczane lub że nie powinno się go uczyć. char[]nadal należy pamiętać, ponieważ C ++ jest nadzbiorem języka C i konieczne jest , aby został poprawnie zrozumiany, jeśli w ogóle można się go nauczyć.
Rei Miyasaka
7
Tak - bardzo, bardzo długo po tym, jak opanowali każdy inny aspekt języka. Wolę uczyć nowych studentów częściowych specjalizacji szablonowych i SFINAE. W C ++ używasz std::string, a jeśli musisz współdziałać z interfejsem API C, to po to c_str()jest. Nie ma potrzeby, aby programiści radzili sobie z tym char[]lub NULL w żadnym z nich. Obsługa ciągów w stylu C jest całkowicie i całkowicie przestarzała dla każdego możliwego zastosowania, z wyjątkiem interakcji ze starym kodem C, który jest doskonale obsługiwany c_str().
DeadMG
4
Nie ma czegoś takiego jak nauczanie char[]dobrze, ponieważ wszystkie zastosowania char[]są złe. Twój profesor prawdopodobnie byłby absolutnie w porządku, gdyby utknął w C ++ zamiast C.
DeadMG
4
Państwo będzie zobaczyć kod C stosowany w C ++ czy C czy nie napisać samemu, a w konsekwencji, jeśli jesteś nauki C ++, trzeba nauczyć C. Jak już mówiłem, nie toleruje go, ale fakt Chodzi o to, że szkoły zazwyczaj uczą języka C, a następnie uczą się języka C ++ później, ponieważ uczniowie muszą uczyć takich rzeczy, jak projektowanie systemów operacyjnych - które, z wyjątkiem BeOS i niektórych systemów badawczych, absolutnie wymagają C. W tym celu musisz zrozumieć ciągi C. Znowu, po raz trzeci, gdybym miał swoją drogę, nie uczyłbym w ogóle C ++ studentów pierwszego roku, a po raz ostatni jest to całkowicie poza tym.
Rei Miyasaka,
14

Niestety, nie ma zbyt wiele podstawowych rzeczy na temat C ++, więc nie chciałbym mieć większych nadziei. Ponadto niewiele wiadomo o języku C #, który można nawet zdalnie przenieść na język C ++, więc nie spodziewałbym się, że istniałby jakiś konkretny materiał obejmujący ten kąt. Musisz nauczyć się od zera.

DeadMG
źródło
3
To by wyjaśniało, dlaczego niewiele tam jest. Po przeczytaniu C ++ wydaje się, że masz rację - to zupełnie inny świat. Dzięki za pomoc.
Mark Williams
1
+1, niewiele wiesz o C #, które można nawet zdalnie przenieść do C ++ . Nauczyłem się tego na własnej skórze.
ApprenticeHacker
W skrócie, powiedziałbym, że jest wiele podstawowych wersji C ++. Odróżnianie wskaźniki / odniesień i Szablony C ++ można dostać zawrotu głowy na początku, ale kiedy przychodzi do niego nadal istnieją klasy, couti proste sposoby, aby osiągnąć cele proste
Kieren Johnstone
1
@KierenJohnstone: Prawdopodobnie masz na myśli „powolne i niebezpieczne pod względem wyjątków sposoby robienia rzeczy”, takie jak „rozpad tablicy na wskaźnik” i podobne.
DeadMG
12
Ładna, całkowicie nieprzydatna odpowiedź.
dbracey,
9

Nie ma na to łatwej poprawki, C ++ nie jest szczególnie trudny, ale nie jest łatwy dla początkujących.

Poleciłbym poczytać o podstawach programowania w C (aby uzyskać podstawy dla rzeczy, które znajdziesz na niskim poziomie), a następnie nauczyć się języka STL, a następnie artykułów takich jak Scott Meyers. Oto jeden na początek, ponieważ pokazuje, jak powinieneś pisać nowoczesne C ++ w porównaniu do C-z-klasami.

gbjbaanb
źródło
2
+1: Dodałbym kupowanie książek Meyera (skuteczna seria C ++ / STL). Mam je wszystkie i są niesamowite.
Steven Evers,
12
-1 dla reading up on C programming. Myślę, że przynosi to więcej szkody niż pożytku i przekazuje pogląd, że C i C ++ to języki, które należy wspólnie studiować.
sebastiangeiger
2
@sebastiangeiger: nie rozumiesz, że kiedy trzeba pracować z istniejącymi aplikacjami C ++ w prawdziwym świecie, najczęściej będziesz miał do czynienia z konstrukcjami podobnymi do C. Stąd +1, przynajmniej w celu wyeliminowania twojego przegłosowania.
Doc Brown
5
@DocBrown Może, ale jestem teraz przy jednym z tych starszych projektów C ++ i mogę powiedzieć, że moi poprzednicy byli w większości tylko programistami C, którzy zapisali swoje pliki źródłowe jako * .cpp. Odkryłem, że używam dużo mniej, deletea tablice C i inne rzeczy są odradzane w C ++ niż oni, co przypisuję NIE wyraźnemu studiowaniu C. C jest stosunkowo prosty, możesz dość szybko dowiedzieć się, co robi kod.
sebastiangeiger
3
@gbjaanb: W STL nie ma nic, co wymaga znajomości malloci free. Wielki deweloper C ++ w końcu będzie chciał o nich wiedzieć. Zaczynanie od nich to zupełnie inna sprawa.
DeadMG
7

Nie jestem pewien, czy nadal szukasz materiałów, ten artykuł znalazłem kilka miesięcy temu. To nie jest książka (tylko 53 strony). Wprowadzenie mówi wszystko:

This is a somewhat short guide to the important things to know if you are a C# programmer and find yourself needing or wanting to work in C++

http://geekswithblogs.net/mikebmcl/archive/2012/02/02/c-to-c-ndash-a-somewhat-short-guide.aspx

Jest też post o aktualizacji:

http://geekswithblogs.net/mikebmcl/archive/2012/02/14/c-to-cndasha-somewhat-short-guide-update-1.aspx

Miłej nauki :)

Chris
źródło
Zachowaj jednak ostrożność podczas korzystania z tego dokumentu, ponieważ pokazuje on C ++ w sposób bardzo skoncentrowany na Microsoft (tak też mówi). Nie rozróżnia między funkcjami C ++ 03 i C ++ 11, a czasem nawet pokazuje niestandardowe rozszerzenia jako preferowane rozwiązanie. Jeśli będziesz postępować zgodnie z tym przewodnikiem, otrzymasz wysoce nieprzenośny kod.
Fabio Fracassi,
4
  • Uważaj na zarządzanie pamięcią. Dowiedz się, jak działają wskaźniki i odwołania w C ++ w przeciwieństwie do C #. Wreszcie RAII, ręczne zarządzanie pamięcią i inteligentne wskaźniki.
  • Szablony i ogólne wyglądają podobnie, ale są różnymi zwierzętami. Poznaj elementy wewnętrzne szablonów.
  • Istnieje kilka drobnych, ale chwytliwych różnic składniowych. Naucz się ich.
  • Przyzwyczaiłeś się do STL zamiast .net BCL. Jeśli masz uzależnienie od LINQ, możesz przegapić kilka dobrych bitów.
  • Istnieją pewne podstawowe różnice projektowe między C ++ i C #. Więc nie możesz po prostu przenieść pomysłu. Cokolwiek zbudujesz w C ++, musisz projektować od zera.
  • Powodzenia
Gulszan
źródło
1

Myślę, że dobrze, że nie znajdziesz zbyt wielu samouczków od C # do C ++. Prawdopodobnie mogą zmiażdżyć twój mózg. To tak, jakby najpierw nauczyć się jeździć na motocyklu, a potem przejść na rower (nie do końca odpowiednia anologia, ale masz pomysł). Lepiej jest wziąć świeżą książkę o C ++. Ponieważ znasz już koncepcje OOP, możesz albo pominąć długie wprowadzenie do koncepcji OOP (są one przeznaczone dla osób migrujących z C do C ++). Lub od razu sięgnij po książkę informacyjną przeznaczoną dla początkujących lub średnio zaawansowanych lub średniozaawansowanych.

DPD
źródło
1

Poleciłbym udać się do Rosetta Code i porównać oba. Podczas gdy tam jesteś, trzymaj pod ręką link idiomów C ++ i spróbuj je znaleźć. Następnie poświęć trochę czasu na obszar wskaźnika / odniesienia / pamięci / destruktora. Potem dowiedz się o preprocesorze - naprawdę może być twoim przyjacielem, jeśli chodzi o ukrywanie brzydek, trochę mi brakuje. Wreszcie STL.

znak
źródło
1

Mniej więcej rok temu byłem na tej samej łodzi, co ty: samoukałem c # dev, który czuł potrzebę nauki C ++. Oczywiście, zatrzymałem się i zacząłem wiele razy. Przy trzeciej próbie w końcu udało mi się.

Konieczne jest zrozumienie, że pod względem metodologii C ++ i C # prawdopodobnie poświęcisz dużo czasu na zrozumienie, jakie metody manipulacji danymi za pomocą wskaźników i referencji naprawdę oznaczają, a także kiedy i jak z nich korzystać w danych okolicznościach.

Zaletą C ++ jest to, że alokacja stosu obiektów jest w większości dość prosta i powinieneś alokować obiekty w ten sposób, jeśli twój program spełni wymagania określone w tej metodzie. W przeciwnym razie polegasz na wskaźnikach prędkości, wydajności i szybkiego czyszczenia. Zalecam przeczytanie tego: http://www.parashift.com/c++-faq-lite/, ponieważ da Wam DUŻO techniczne zrozumienie, jak C ++ działa pod maską.

Dam ci przykład:

W C ++ istnieje ta implementacja konstruktora znana jako „lista inicjująca”, która różni się od inicjowania elementów klasy w treści konstruktora. Czemu? Ponieważ, chyba że inicjowany typ jest prymitywny, kompilator faktycznie utworzy wiele niepotrzebnych kopii tworzonego obiektu, gdy zostanie przydzielony w ciele ctora. Może to potencjalnie zmniejszyć wydajność, w zależności od kompilatora, a także skalowanych wymagań aplikacji.

Wiesz, kim jest delegat? Cóż, w C ++ jest znany jako wskaźnik funkcji . Na początku ten język jest dość trudny do opanowania, ale jeśli chcesz być niesamowity ... to zdecydowanie wymagany.

C # jest łatwe ... bardzo łatwe.

o pustym miejscu
źródło
Delegaci C # i wskaźniki funkcji c są zupełnie inne. Delegat jest bliżej funktora w C ++ niż wskaźnika funkcji.
CodesInChaos
-2

Uwierz mi, wybierz dobrą książkę o C ++ (jest o wiele więcej, po prostu wyszukaj) i zacznij się uczyć ...

Muhammad Hewedy
źródło
1
BTW, nauczenie się trochę C wcześniej (wskaźniki, tablice, struktura) będzie dobre
Muhammad Hewedy
7
Nauka języka C przed C ++ wróci do epoki kamienia łupanego. W dzisiejszych czasach bardzo rzadko używamy tablic i wskaźników w C ++. Język ewoluował od nich dawno temu.
fredoverflow
7
@Muhammad: Wszyscy inni wolą szybkość, bezpieczeństwo, łatwość konserwacji.
DeadMG
3
@DPD: Cóż, wielu profesjonalnych programistów C ++, w tym Bjarne Stroustrup (wynalazca języka), nie zgadza się z tobą. Jego najnowsza książka uczy korzystania z obiektów i szablonów od samego początku, podczas gdy tablice i wskaźniki nie są w ogóle omawiane przed rozdziałem 17 (strona 500 i coś takiego).
fredoverflow
2
@DeadMG. Być może, ale nie można cofnąć ewolucji C-> C ++. Jeśli nie znosisz części C C ++, wybierz Java lub C #. Osobiście odkryłem, że skoncentrowanie się na wskaźnikach i tablicach w C przed przejściem do C ++ bardzo mi pomogło w mojej karierze. Jasne, możesz kodować całą aplikację bez nich, ale jeśli chcesz korzystać z zalet polimorfizmu, musisz znać wskaźniki. Ile ważnych wzorców GoF można wdrożyć bez wskaźników? Nie było tak samo dla moich przyjaciół, którzy unikali „trudnych” części podczas studiowania C. Większość z nich miała trudności ze zrozumieniem polimorfizmu.
DPD