C ++ için C ++


24

Ben C # oldukça iyi biliyorum (ne yazık ki kendi kendine) ve bir Windows uygulaması için bazı C ++ programlama yapmak gerekiyor. C # öğrenen C ++ geliştiricileri için bir ton bilgi bulabildim, ancak C # bildiğiniz zaman C ++ öğrenmeye dair çok şey bulamadım. Birisi temellerin iyi bir şekilde gözden geçirilmesiyle karşılaştı mı?

MSDN'nin bir karşılaştırması var ama çok ayrıntılı değil.

Birkaç kaynağı bir araya getirebilirim ama orada bir şey olduğunu düşündüm - bulamıyorum. Yardımın için teşekkürler.


27
Neden "ne yazık ki"? Kendini böyle bırakma. Bir C # geliştirici bilmiyorum değildir kendi kendini yetiştirmiş. Birçoğu şaşırtıcı geliştiricilerdir.
Steven Evers

6
@SnOrfus - çünkü akademi bunu irrasyonel sözde-politik sebeplerden mahrum bıraktığı için.
Rei Miyasaka,

5
Benim ilk tavsiyem, C # bağlamında C ++ öğrenmeye çalışmayın. Çünkü C # C ++ değildir ve C ++ C # değildir. Bunu yapmak aptalca bir ifade olabilir, ancak C #, işaretçilerin yanlış yapılmasını zorlaştırır ve C ++ 'da yanlış yapmak çok kolay, hatta bunları gerçekten kolaylaştıran araçlarla bile. İki dilin ortak paylaştığı pek çok şey olduğunu ekleyeceğim. Temel olarak, bir Elma ve Portakal'ın hem ağaçta yetiştirildiğini hem de tohumlara sahip olduklarını ve dolayısıyla meyve olduklarını söylemek gibidir.
Ramhound

2
@ReiMiyasaka, C # geliştiricilerinin VB. NET'te nasıl göründüklerinden farklı olarak değil.
Kyralessa

1
@Kyralessa Aynı zamanda talihsiz bir durumdur. Bence VB.NET demografisine yönelik küçümseme kadar politik bir mesele değil - çünkü C # erken evlat edinenlerin çoğunun bir C / C ++ geçmişi var. Okulum yeni başlayanlar için VB.NET kullanıyordu. VB.NET'in bir oyuncak olduğunu düşünüyorlar ve bu nedenle öğrencilerin C # kadar zihinlerine zarar vermemeliler.
Rei Miyasaka,

Yanıtlar:


10

Java geliştiricileri için C ++ ile ilgili bu konu çok benzer ve özellikle Mark Byer'in gönderisi için yararlı olmalı:

Bu kitapları okuyun:

Muhtemelen akılda tutulması gereken en önemli şey , bellek yönetimi tekniklerindeki C # / Java ve C ++ arasındaki farkı anlamaktır .

Uzmanlığımdan biri Java kökenliydi ve pasta olacağını düşünerek tanıtıcı bir C ++ dersi verdi. Açıkladığı hiçbir şey kimseye bir anlam ifade etmiyordu. Her yerde hafıza sızıntısı vardı. İşaretçi aritmetiği korkunçtu. Müfredatın OOP kısmına hiç gelmedi (çok şükür). Neredeyse gösterdiği hiçbir şey derlenmeyecekti. char[]Nöbetçi ihtiyacı olduğunu anlamadı \0. Onun gibi bitme.


4
C ++ 'daki kimsenin char[]o zaman kullanmaması üzücü değil mi?
DeadMG

5
@DeadMG Amacınızı tam olarak göremiyorum. Sırf char[]nadiren C ++ 'da kullanıldığı için öğretilmediği veya öğretilmemesi gerektiği anlamına gelmez. char[]C ++ 'ın C'nin bir süperseti olduğu için farkında olmak hala önemlidir ve eğer öğrenilirse doğru anlaşılması şarttır .
Rei Miyasaka,

7
Evet , dilin her bir yönü hakkında usta olduktan sonra çok çok, çok uzun bir süre . Yeni öğrencilere kısmi şablon uzmanlığı ve SFINAE öğretmeyi tercih ederim. C ++ 'ta kullanıyorsunuz std::stringve bir C API ile birlikte çalışmak zorundaysanız, c_str()bunun için var. Programcının char[]hiçbirinde NULL sonlandırma ile uğraşmasına veya sonlandırmasına gerek yoktur . C tarzı dize kullanımı, tamamen iyi idare edilen eski C koduyla birlikte çalışma dışında her olası kullanım için tamamen ve tamamen ve tamamen kullanımdan kaldırılmıştır c_str().
DeadMG

4
char[]Doğru öğretme diye bir şey yoktur , çünkü tüm kullanımları char[]yanlıştır. Profesörünüz C yerine C ++ 'a sıkışmış olsaydı kesinlikle iyi olurdu
DeadMG

4
Sen olacak ben, C kodu C öğrenme eğer ++, sen C. olarak ben söyledin öğrenmemiz gerekiyor, sonuç olarak C yazma ister C ++ kullanılan ya da olmasın kendinizi ve bakın yoktur Bunu görmezden ama gerçeği BeOS ve bazı araştırma işletim sistemleri hariç, kesinlikle sen Bunun için C gerektirir - Sorun öğrencileri OS tasarım gibi şeyler öğretilmesi gerektiğinden okullar genel olarak sonraki C ++ C ve daha sonra tack öğretmek olduğunu do C dizeleri anlamak gerek. Ben yoluma olsaydı Yine, üçüncü kez, ben ederim değil yeni başlayan öğrencilere hiç C ++ öğretmek ve son kez, o noktadan yanında tamamen bu.
Rei Miyasaka,

14

Ne yazık ki, C ++ ile ilgili temel olan pek bir şey yok, bu yüzden umutlarını alamadım. Ek olarak, uzaktan C ++ 'a bile aktarılabilen C # hakkında çok az şey bileceksiniz, bu yüzden bu açıyı kapsayan herhangi bir özel malzemenin olmasını beklemiyorum. Sıfırdan öğrenmeniz gerekir.


3
Bu neden orada fazla olmadığını açıklar. C ++ 'ı okuduktan sonra, biraz haklı gibi görüneceksiniz - bu tamamen farklı bir dünya. Yardımın için teşekkürler.
Mark Williams,

1
+1, uzaktan C ++ 'a bile aktarılabilen C # hakkında bilmeyeceğiniz çok az şey var . Bunu zor yoldan öğrendim.
ApprenticeHacker

Hızlı bir nokta olarak, temel olan birçok C ++ olduğunu söyleyebilirim. İşaretçileri / referansları ve C ++ şablonlarını ayırt etmek ilk başta kafanızı döndürebilir, ancak bu konuya gelince hala sınıflar coutve basit hedeflere ulaşmanın basit yolları vardır
Kieren Johnstone

1
@KierenJohnstone: Muhtemelen "dizi-işaretçi çürümesi" gibi şeyler yapmanın "yavaş ve istisnai güvensiz yollarını" ve benzeri şeyleri kastediyorsunuz.
DeadMG

12
Güzel tamamen yararsızdır cevap.
dbracey

9

Bunun için kolay bir düzeltme yok, C ++ özellikle zor değil, ama yeni başlayanlar için kolay değil.

C programlamanın temellerini okumanızı tavsiye ederim (bulacağınız düşük seviyeli şeyleri topraklamak için), ardından STL'yi ve ardından Scott Meyers'ın beğenilerini içeren makaleleri öğrenin. İşte size başlamanız için bir tane var ; bu, C-sınıfı ile karşılaştırıldığında nasıl modern C ++ yazmanız gerektiğini gösteriyor.


2
+1: Meyer kitaplarını almayı eklerdim (etkili C ++ / STL serisi). Hepsini aldım ve harikalar.
Steven Evers

12
-1 reading up on C programming. Bunun iyiden daha fazla zarar verdiğini düşünüyorum ve C ve C ++ 'nın birlikte çalışılması gereken diller olduğu fikrine uyuyor.
sebastiangeiger

2
@sebastiangeiger: Mevcut gerçek dünya C ++ uygulamalarıyla çalışmak gerektiğinde en çok C benzeri yapılarla uğraşmak zorunda kalacağınız noktayı kaçırıyorsunuz. Bu nedenle + 1, en azından olumsuz oyunuzu kaldırmak için.
Doktor Brown

5
@DocBrown Belki, ama şu anda şu C ++ eski projelerinden birindeyim ve öncekilerimin büyük ölçüde sadece kaynak dosyalarını * .cpp olarak kaydeden C programcıları olduğunu söyleyebilirim. Çok daha az kullandığımı deleteve C dizilerini ve C ++ 'da caydırıcı olan diğer şeyleri kullandıklarından daha fazla kullandığımı farkettim , ki bu açıkça C'yi incelemek için değil.
sebastiangeiger

3
@gbjaanb: hiçbir şey bilmeden gerektirir STL hakkında, hiç var, mallocve free. Büyük bir C ++ dev sonunda onlar hakkında bilmek isteyecektir. Onlarla başlamak tamamen farklı bir şey.
DeadMG

7

Hala malzeme arıyorsanız emin değilim, bu makaleyi birkaç ay önce buldum. Bu bir kitap değil (sadece 53 sayfa). Giriş her şeyi söylüyor:

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

Ayrıca bir de güncelleme yayını var:

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

Mutlu öğrenme :)


Bu belgeyi kullanırken çok dikkatli olun, ancak C ++ 'ı Microsoft merkezli bir şekilde gösteriyor (aynı zamanda söylüyor). C ++ 03 ve C ++ 11 özellikleri arasında ayrım yapmaz ve bazen tercih edilen çözüm olarak standart olmayan uzantıları bile gösterir. Bu kılavuzu izlerseniz son derece taşınabilir bir kod elde edersiniz.
Fabio Fracassi

4
  • Bellek yönetimi için dikkat edin. İşaretçilerin ve referansların C ++ 'ın aksine C ++' da nasıl çalıştığı hakkında net bir fikir edinin. Ayrıca, RAII, manuel hafıza yönetimi ve sonunda akıllı işaretçiler.
  • Şablonlar ve jenerikler benzer gözüküyor ancak farklı canavarlar. Şablonların nasıl çalıştığının içsellerini bilir.
  • Bazı küçük ama akılda kalıcı sözdizimsel farklılıklar var. Onları öğren.
  • Net BCL yerine STL kullanmaya başladınız. LINQ bağımlılığı varsa, bazı iyi bitleri kaçırabilirsin.
  • C ++ ve C # arasında bazı temel tasarım farkları var. Yani, sadece bir fikri taşıyamazsınız. C ++ ile kurduğunuz her şeyi sıfırdan tasarlamanız gerekir.
  • İyi şanslar

1

Çok fazla C # to C ++ öğretici bulamamanın iyi olacağını düşünüyorum. Muhtemelen beynini karıştırırlar. İlk önce bir motosiklet sürmeyi öğrenmeye çalışmak ve daha sonra bisiklete geçmek gibi bir şey (tamamen uygun bir anoloji değil ama siz anlıyorsunuz). C ++ ile ilgili yeni bir kitap almanız daha iyi olur. OOP kavramlarını zaten bildiğiniz için, OOP kavramlarının uzun tanıtımlarını atlayabilirsiniz (bunlar, C'den C ++ 'a göç eden insanlar içindir). Ya da başlangıçtan orta ya da orta seviyelere yönelik referans kitabı için yönlendirin.


1

Rosetta Koduna gidip ikisini karşılaştırmayı tavsiye ederim. Sen oradayken kullanışlı C ++ deyimlerinin linkini tut ve onları bulmaya çalış. Sonra işaretçi / başvuru / bellek / yıkıcı alemine biraz zaman ayırın. Bundan sonra önişlemciyi öğrendikten sonra - çirkinleri gizleme konusunda gerçekten arkadaşınız olabilir, onu özlüyorum. Sonunda, STL.


1

Yani, yaklaşık bir yıl önce, sizinle aynı teknedeydim: C ++ öğrenmeye ihtiyaç duyan kendi kendine c # dev öğretti. Verilmiş, durdum ve birçok kez başladım. Üçüncü denememde sonunda buna sıkışıp kaldım.

Bunu anlamak için zorunlu olan şey, C ++ ve C # metodolojileri açısından, işaretçiler ve referanslar aracılığıyla veri işleme yöntemlerinin gerçekte ne anlama geldiğini ve bu koşullar altında ne zaman ve nasıl kullanılacağını anlamak için çok zaman harcayacağınızdır .

C ++ ile ilgili güzel olan şey, nesne yığını tahsisinin çoğunlukla oldukça basit olmasıdır ve eğer programınız bu yöntemde belirtilen gereksinimleri karşılayacaksa, nesneleri bu şekilde tahsis etmelisiniz. Aksi takdirde, hız, verimlilik ve hızlı temizlik için işaretçilere güvenirsiniz. Bunu okumanızı öneriyorum: http://www.parashift.com/c++-faq-lite/ , C ++ 'ın kaputun altında nasıl çalıştığını çok fazla teknik olarak anlamanızı sağlayacaktır.

Sana bir örnek vereyim:

C ++ 'da, bir kurucu bünyesindeki sınıf üyelerini başlatmaktan farklı bir "başlatma listesi" olarak bilinen bu kurucu uygulama vardır. Niye ya? Çünkü başlatılmakta olan tür ilkel olmadıkça, derleyici aslında ctorun gövdesinde tahsis edildiğinde yaratılan nesnenin çoklu ve gereksiz kopyalarını yaratacaktır . Bu, derleyiciye ve uygulamanın ölçeklendirilmiş gereksinimlerine bağlı olarak performansı potansiyel olarak düşürebilir.

Bir delegenin ne olduğunu biliyor musun? Peki, C ++ 'da bir fonksiyon işaretçisi olarak bilinir . Bu dil ilk başta ustalaşmak oldukça zor, ama harika olmak istiyorsan ... kesinlikle gerekli.

C # kolaydır ... çok kolaydır.


C # Delegeler ve c işlev işaretçileri oldukça farklıdır. Bir temsilci, C ++ 'daki bir functor'a işlev işaretçisine göre daha yakın.
KodlarInChaos

-2

İnan bana, C ++ ile ilgili iyi bir kitap seç (çok daha fazlası var, sadece bir arama yap) ve öğrenmeye başla ...


1
BTW, daha önce bazı C öğrenme (işaretçiler, diziler, yapı) iyi olacak
Muhammad Hewedy

7
C ++ 'dan önce C öğrenmek, seni taş devrine geri döndürür. Günümüzde C ++ 'da dizileri ve işaretleyicileri nadiren kullanıyoruz. Dil uzun zaman önce onlardan uzaklaştı.
fredoverflow,

7
@Muhammad: Diğer herkes hız, güvenlik ve bakım kolaylığı tercih ediyor.
DeadMG

3
@DPD: Bjarne Stroustrup (dilin mucidi) dahil olmak üzere birçok profesyonel C ++ programcısı sizinle aynı fikirde değil. En son kitabı, başından beri nesneler ve şablonlar kullanmayı öğretiyor; oysa diziler ve işaretçiler Bölüm 17'den önce hiç konuşulmuyor (sayfa 500 ve bir şey).
fredoverflow

2
@DeadMG. Belki, ama C-> C ++ evrimini geri alamazsınız. C ++ 'ın C bölümünden nefret ediyorsanız Java ya da C #' ya gidin. Şahsen, C ++ 'a gitmeden önce C işaretçilerine ve dizilere yoğunlaşmanın kariyerimde çok yardımcı olduğunu öğrendim. Tabii ki, onlar olmadan bütün bir uygulamayı kodlayabilirsiniz, ancak polimorfizmin faydalarını istiyorsanız, işaretçileri bilmeniz gerekir. Önemli GoF kalıplarından kaç tanesi işaretçiler olmadan uygulanabilir? C'yi okurken "zor" kısımlardan kaçınan arkadaşlarım için aynı değildi. Birçoğu polimorfizmi anlamayı zor buldu.
DPD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.