Verilen C ++ '11 Onaylandı, Bu Bir C ++ Acemi Dilini Nasıl Öğrenir? [kapalı]


21

Bir süredir C ++ öğrenmek istedim ve Lisede AP Bilgisayar Programcılığı yaptım (C ++ ve Java değilken). C'den zevk alıyorum ve sadece C ++ öğrenme zamanını bulamadım ya da sadece daha üretken olduğum C # 'a geri döneceğim.

Sorum şu: C ++ '11 onaylandıysa (tam olarak uygulanmadığını bilmeme rağmen) bu, C ++ öğrenmeye yaklaşmam gerektiği şeklini değiştiriyor mu? Ben C ++ 'a sahibim : 1998'den itibaren Herb Schildt’in Komple Referansı . Yeni onaylanan standart, bu tür kitaplardan öğrenmeyi, standart şeyleri içeren bazı yeni derslerden / kitaplardan daha az önemli kılıyor mu? Eski kitaplardan öğrenmenin bir faydası var mı?


9
Oof. Schildt. C ++ materyallerinin kalitesi ile konuşamıyorum, ancak C materyalleri uzun süredir standart dışıydı (C: TCR'nin son baskısında bile bazı önemsiz hatalar var). Farklı bir yazarın daha güncel bir iş aramasını tavsiye ederim.
John Bode

C ++ 11, en son sürümde tanıtılan ve C ++ 'nın önceki bir sürümünde bulunmayan bir şeyi yapmak için öğrenilmesi gereken C ++ temellerini değiştirmedi.
Ramhound

11
Herb Schildt'in hiçbir kitabına asla güvenme. Gerçekten, C ++ kitaplarının çoğunluğu kötü kitaplar olsa da (ve buradaki stil sorunlarına atıfta bulunmuyorum, ancak bariz gerçek hatalar ve buggy koduna yol açtığı bilinen programlama stillerini teşvik ediyorum), Schildt'in kitapları çok kötü oldu. Onun adı bir nevi meme oldu.
sbi

4
@ Ramhound: Ben katılmıyorum. Eğer bu doğru olsaydı, hepimiz ilk önce manuel kaynak yönetimini ve daha sonra da dinamik kaynakları yapmanın daha güvenli yollarını öğrenirdik. Neyse ki, bu (yavaşça) değişiyor. Yeni olasılıklar, kütüphanede "sadece" olsalar bile, yeni deyimler gerektirir. Bir dille başlarsanız, neden sadece daha sonra öğrenmek için eski deyimleri öğrenmelisiniz?
sbi

Yanıtlar:


16

Kesinlikle. Bu günlerde genellikle 2. derste olan üç şey çok daha sonra hareket etmelidir:

  • char *, strlen, strxxx yöntemleri vb. gibi dizeler
  • genel olarak diziler ve işaretçi aritmetiği
  • yenilerini sil, [] yenilerini [] sil ve hatta yıkıcılar

Genellikle 99. derste olan şeyler çok, çok daha erken hareket etmelidir.

  • kullanılacak şeyler olarak şablonlar (çok fazla değil)
  • std :: string
  • std :: Shared_ptr <>
  • std :: vector <>, yineleyiciler, diğer koleksiyonlar

Evey ham işaretçisi hemen akıllı işaretçi sarıcısına verilmelidir (paylaşılanla başlayacağım ve daha sonra benzersiz düşüneceğim çünkü std :: move ve rvalue referanslarını açıklamak gerekiyor). Bunu yapmak, C ++ 'ı öğrenmek, kütüphaneyi dille aynı anda öğrendiğiniz Java veya C # öğrenmek gibi hissetmenizi sağlar. Bu, hafıza çalışmalarının çoğunu da alacak ve insanları gotchas için daha az endişeli bırakacaktır.

Koleksiyonda tekrarlamak istediğimiz ve her öğeye bir şeyler yapmak istediğimizde, Lambdas'ı ilk kez resme dahil ederdim.

Yasal Uyarı: Şu anda Çoğulculuk için bir C ++ kursu yazıyorum ve bu yaklaşımı kullanıyorum. Son modül “başkalarının kodunu anlamak” ve char * dizgileri, manuel bellek yönetimi, işaretçi aritmetiği ve benzeri gibi kafa karıştırıcı şeyleri koyacağım yer.

Güncelleme: birkaç kişi neden C ++ 0x 'in varlığının C ++ 03 ile öğretilebilecekleri öğretmeye neden olduğunu sordu. Bence bir çok şey var:

  • koleksiyon dostu olan gerçekten akıllı işaretçiler, her zaman yeni / silme, işaretçi aritmetik vb. geri çekilmemize neden olan "Çalışan işaretçiler dizisi" gibi şeylere olan ihtiyacı ortadan kaldırıyor.
  • otomatik yineleyici beyanları acısını ortadan kaldırır
  • lambdas sıradan bir insanın yapacağı bir şeyi ön plana çıkarır
  • >>doğru ayrıştırma kadar önemsiz olan bir şey bile , bazı şablon şablonlarını bildirirken var olanları ortaya çıkarır.
  • ve bunun gibi

Gördüğüm gibi, bir süre önce C ++ öğretme biçimimizde değiştirebileceğimiz şeyler olabilirdi, ancak bazılarımız geri çekildi, çünkü eski okul yöntemine bir geri dönüş için hala ihtiyacımız vardı ya da öğretmek için çok şey vardı Arcane bilgi.


3
Neden manuel bellek yönetiminin daha sonra öğretilmesi gerektiğini düşünüyorsunuz? Bilmenin önemli olduğunu ve akıllı işaretçiler öğrenilirken daha fazla takdir edeceğini düşünüyorum. C'de bellek yönetimini (ve char dizileri) öğrenmek zorunda kaldım ve bunu yapmak zorunda olmasaydım RAII ve std :: string'i daha fazla takdir etmemi sağladı.
Jetti,

1
Örnekleriniz çoğunlukla C ++ 98'e karşılık C ++ 11'e değil standart öncesi C ++ 'a uygulanır. Bana verilen lambda'nın std::for_each()eskisinden çok daha popüler olacağını, autoçok önemli olacağını ve yeni fonksiyon bildirimi sözdiziminin decltypeşablon kodunda oldukça fazla kullanılacağını düşünüyorum. Bunlar mevcut C ++ kitabının öğretmediği şeyler. Ancak, evet, genel olarak sizinle aynı fikirdeyim ( +1). C ++ kursları vermeye başladığımda, Accelerated C ++ ile başladım ve kursum bundan daha fazla sapmaya başlasa da, temel prensibine sadık kalıyor.
sbi

3
@Jetti: Nadiren manuel kaynak yönetimi yapıyorum ve eğer yaparsam, RAII sınıflarını uygulamak için. Ancak, bu sınıfların çoğunu kullanıyorum . Buna göre , RAII maddelerinin kullanımı , ham kaynaklarla uğraşmaktan daha önemli görünmektedir ve bu nedenle daha önce vurgulanarak daha fazla öğretilmelidir.
sbi

1
@sbi: Sizinle orada aynı fikirdeyim - bu örneklerin çoğu 2006'dan itibaren Modern C ++ 101'e benziyor, C ++ 11 ile ilgili yeni bir şey değil.
DeadMG

2
@Jetti: C ++ 'da uzmanlaşmaya yönelik en önemli adım, manuel bellek yönetiminden kaçınabileceğiniz tüm yolları öğrenmek . Bu, “otomatik” bellek yönetiminden ne kadar ileri gidebileceğinizi öğrendikten sonra “daha ​​sonra” öğretilmesi gereken bir şeydir.
jalf

9

Neredeyse evet. Basit gerçek şu ki, C ++ 98 ve 03'te, örneğin fonksiyonel programlama için dil desteğinin düşük kalitesi nedeniyle birçok iyi uygulama temelde kullanılamazdı. Artık lambdalar var ve çalışıyorlar, insanlar işlevsel arayüzleri eskisinden çok daha iyi kabul etme eğilimindedirler ve genel programlama eskisinden daha güçlüdür.

1998'de insanlar C ++ kullanarak yüksek kaliteli, güvenli, hızlı kod yazmayı keşfetmeye yeni başlıyorlardı ve birçok kod "C Sınıflar" dı. C ++ 11 yılında çok farklı- kopyalama ve swap ve (şimdi beş) Üçlü Kural gibi deyimler iyi bilinen ve tanımlanır ve türlerini yönetmek çok daha fazla kaynak Standart gibi olmuştur var shared_ptrve unique_ptrnereye önceki Standartları sadece onları bıraktı boşluk delikleri olarak.

Görebilirsiniz Bu soruyu C ++ üzerindeki referans malzemenin mükemmel bir liste için.


1
Aslında 1998’den birkaç yıl önce “sınıflı C” nin sonunun başlangıcını koyardım, ama genel olarak kesinlikle haklısınız ve yarım on yıldan fazla pazarlık etmem. +1benden.
sbi

4

Bahsettiğiniz belirli kitabı bilmiyorum. Ancak genel olarak, C ++ sözdizimi, veri tipleri ve OOP ile ilgili tüm temel bilgilerin hala geçerli olduğunu söyleyebilirsiniz. Aynı, yeni başlayan kitapların çoğunda belirtilen STL kütüphaneleri için de geçerli olmalıdır.

Her ne kadar 1998'den daha eski bir kitap, toplulukta yıllar boyunca biriken C ++ programlama tarzında birkaç güncelleme ve gelişmeyi kaçırmış olabilir. Güncel kaynaklar için biraz daha fazlasını arardım. Size iyi bir başlangıç ​​sağlayacak kadar fazlasıyla ücretsiz çevrimiçi öğreticiler ve belgeler var. Hatta bazıları C ++ 0x bile diyebilir.

C ++ 0x kesinlikle programcıların dili nasıl görüp kullandıkları konusunda çok fazla değişiklik yapacak. Ancak bu, yeni özelliklerin anlam kazanmaya başladığı daha karmaşık projeleri etkileyecektir. Yeni başlayanlar için bu önemli olmamalı ve mevcut kavramlarla rahat olmaya konsantre olabilirsiniz, bu zaten öğrenmeniz yeterli. Başlangıç ​​seviyesindeki kitapların çoğu, örneğin, şablonların içine girmez, bu nedenle, yeni variadic şablonları, şimdi bilmeniz gerekenler değildir.

Belki bir değişiklik listesine bir göz atalım . En azından döngülere dayalı menzil gibi birkaç konsept yeni başlayanlar için bile büyük olasılıkla ortaya çıkacaktır. Bu yüzden bir göz atmaya değer.


Teşekkürler! Çevrimiçi kaynaklardan veya kitaplardan herhangi birini iyi biliyor musunuz?
Jetti

2
Hayır, cplusplus sitesine sık sık iyi kod yazmak istediğiniz hiç kimseye yönlendirilmemesi gereken bir kaynak olarak bahsedilir.
DeadMG

@DeadMG Alternatif bir web siteniz var mı?
TheLQ

@TheLQ: MSDN başvurusuyla daha da ileri gidersiniz, veya cprogramming.com.
DeadMG

@Jetti: C ++ 'ı öğretmek için C ++ 11'i kullanacak hiçbir malzemenin farkında değilim. Gördüğüm her şey C ++ 11'in üstüne C ++ 11 öğretiyor. Sonuncusunu öğrenmek için stackoverflow.com/questions/388242/… adresine bakın .
sbi

3

Elbette, teknolojiyle ilgili herhangi bir konuda, en yeni malzeme ile güncel olmak her zaman akıllıca bir harekettir, ancak C ++ 11'de sunulan değişiklikler tekneyi sallamak için tasarlanmamıştır. C ++ 'ya yeniyseniz (veya genel olarak programlama), bu endişeleneceğim bir şey değil.

Ek olarak, eğer profesyonel bir programcıysanız, ileride bir başkasının kodu üzerinde çalışacağınıza bahse girebilirsiniz, bu nedenle pratikte amortismana tabi tutulmuş bir teknik olsa bile, işlerin nasıl yürüdüğünü anlamada her zaman bir değer vardır.


Cevabınız için teşekkürler, eski bir kaynak kullanırken en azından eski koda bakmamda bana yardımcı olacağını düşündüm.
Jetti,

Lambda autove asenkron fonksiyonların yürütülmesi "tekneyi sallamak" dışında nasıl bir şey yapabilir?
sbi

1
Yeni araçların tanıtımı ile tasarım felsefesindeki geniş bir kayma arasında bir fark olduğunu iddia ediyorum (örneğin PHP ile görüştüğümüz gibi)
leo

1
@leo: Ben katılmıyorum. STL, akıllı işaretçiler ve zengin şablon olanaklarının tanıtımı, C ++ 'nın ana tasarım felsefesini tamamen değiştirdi. Hemen hemen her destek kütüphanesi, 90'ların ortalama C ++ kütüphanesinden tamamen farklıdır.
sbi
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.