Deyimsel C ++ yazmayı nasıl öğrenebilirim?


27

Ben bir bilgisayar bilimi öğrencisiyim ve bunun sonucunda C ++ 'ya dersleri olan C'nin daha iyi bir sürümü olarak öğretildi. Sonunda karmaşık bir soruna bir çözüm gerektiğinde tekerleği yeniden icat etmeye çalışıyorum, ancak bundan bir süre sonra bulmak için, bazı dil özellikleri veya bazı standart kütüphane rutinleri bunu benim için yapabilirdi.

Ben char*ve *(int*)(someVoidPointer)deyimler konusunda rahatım ama son zamanlarda, açık kaynaklı bir projeye (küçük) bir katkı yaptıktan sonra, birinin C ++ kodu yazarken düşünmesi gerektiği gibi olmadığını düşünüyorum. C'den çok farklı.

Nesneye yönelik programlamayı oldukça iyi bildiğimi ve dik bir öğrenme eğrisi ile iyi olduğumu düşününce, C ++ kodunu yazarken aklımı C ++ yolunda bulmam için ne önerirsiniz?


7
Yorumlarınıza göre C ++ sözdizimini biliyorsunuz ve hepsi bu. C ++ ile kodlamıyorsunuz. Stackoverflow C ++ etiketi bir içermektedir, başlamak için iyi bir yerdir okuma listesi ve SSS . Öğrenmenin tek gerçek yolu, kod yazmak ve deneyimli bir kullanıcının yorum yapmasını sağlamaktır. Kodunuzu incelemek için buraya koyabilirsiniz . İyi bir örnek
Martin York

1
@ LokiAstari'nin tavsiyesiyle (katılıyorum), arkadaşlarınızın haklı olduğunu söyleyebilirim ve Hızlandırılmış C ++ ile yolunuza devam etmek muhtemelen iyi bir fikirdir. Beklediğinizden çok daha az kaymağına ihtiyaç duyacağınıza inanıyorum - konumunuzdaki insanlar için, zaten programlamayı bilen ve öncelikle modern C ++ deyimlerini öğrenmek isteyen insanlar için.
Jerry Coffin,

evet aslında ilk iki bölümü tamamladım, ama oradaki şeyler çoğunlukla bildiğim bir şeydi - bir yazar çıkıp benim için bir kitap yazmazdı, yine de :) @LokiAstari superinformative yorum için teşekkürler :)
yati sagade

3
@yatisagade Bir kitabın, birkaç bölümdeki dilin zihniyetini öğretmesini beklemeyin. Sözdizimini zaten bildiğiniz gibi, çok sıkıcı olabilir, ancak birkaç C ++ kitaptan geçmeye, her şeyi okumaya ve her alıştırmayı dile tam anlamıyla başlangıç ​​yaptığınız gibi yapmaya kararlı olmalısınız. Yanlış yoldan öğretilmek, yanlışları unutmanız ve haklarını (veya bunun gibi bir şeyi) öğrenmeniz gerektiğinden, çabalarınızı ikiye katlamanız gerektiği anlamına gelir.
yannis

1
(İnt) (someVoidPointer) - Ben [...] ile tüm rahatım önce hiç debug 64-bit yapı?
Ed S.

Yanıtlar:


12

Yorumlarınıza dayanarak C ++ sözdizimini bilirsiniz.
C ++ 'da kodlama yapmıyorsunuz, ancak çoğu zaman sınıfları C olarak belirtiliyor.

Stackoverflow'taki C ++ etiketi başlamak için iyi bir yerdir, bir okuma listesi ve SSS içerir .

Öğrenmenin tek gerçek yolu, kod yazmak ve deneyimli bir kullanıcının yorum yapmasını sağlamaktır. Sen edebilirsiniz buradan kodu koymak incelenmek üzere. İyi bir örnek

"Char *" lar için hep çok rahatım

Bunları kullanmayı bırakın, std :: string'e geçin.

ve (int) (someVoidPointer) deyimler.

Bunları kullanmayı bırakın (C kodu ile arayüz dışında). Functor kavramını kullanmak, birkaç avantaj sağlar (kapsama halindeki fikri dahil).

Ancak son zamanlarda, bir OSS projesine (küçük) bir katkı yaptıktan sonra, C ++ 'ta düşündüğünüz gibi olmadığını düşünüyorum. C farklı bir yere sahip olsa da çok farklı.

Evet. C ve C ++ dil olarak ayrılmıştır. Pratik olarak aynı sözdizimini kullanabilseniz de, iyi C kodu genellikle iyi C ++ kodu (veya tam tersi) olarak kabul edilmez.

Bazı arkadaşlar Accelerated C ++ 'ı önermişlerdir, ancak yine de hangi tiplerin, hangi sınıfların ve aşırı yüklenmenin ne olduğunu biliyorum.

Çok temel bilgiler var.

OO kavramlarıyla sağlam görünen C ++ programcısı nasıl dilde aptalca programlar yazabilir?

Bir sürü işle :-)


Bu tek yol değil. İyi kitaplardan çok şey öğrenebilirsin.
Dima

1
@Dima: Kesinlikle. Kitaplardan çok şey öğrenebilirsin. Ancak hiçbir şey deneyimi yenmek ve dili öfkeyle kullanmak, tekrar başarısız olmayı denememek ve bunu yapmanın en iyi yolunu bulmaktır. Sanırım bir kitaptan Fransızca öğrenebilirsin ama Fransızların akıcı olduğunu düşüneceğinden şüpheliyim.
Martin York

6
IMHO, öğrenmenin en etkili yolu kitaplarla başlamak, bir şeyler yapmanın doğru yolunu öğrenmek, pratikte denemek ve daha sonra birinin kodunuzu eleştirmesini sağlamaktır.
Dima

@Dima: Bununla ilgili bir tartışmam yok.
Martin York

12

Etkili C ++ kitabı ilginç şeyler öğretir ve C ++ 'ın özelliklerini takdir etmenizi sağlar. Ayrıca Etkili STL var - Ben okumadım ama STD'ye aşina değilseniz büyük bir okuma olacağını eminim.

Öğrenilecek önemli şey, dili kullanmanız ve tekerleği sürekli olarak yeniden icat etmemeniz gerektiğidir . Onları nasıl yapacağınızı zaten öğrendiniz, bu yüzden kendiniz (ve başkalarının!) İşini kolaylaştırın ve tüm potansiyellerine yönelik araçlar kullanın.

Bir yan not olarak, birçok insan içine edeceğiz talep kullanılacak STD. Bu sadece kullanmak kadar zihniyette de kötü char*- bazen doğru araç değil ve orada başka birçok şey var. Aynı şekilde, kendi konteyner sınıflarınızı yapmaktan vazgeçmeyin - char*en iyi yeri kullanacaksanız, bir sınıfa güvenle sarılır.


Etkili seriyi biliyorum, (okumadım) - Ama sanırım en iyi uygulama sorunları için bunlar değil mi?
yati

3
@ yati sagade: hayır, bu kitaplar tam olarak "C sınıfı" ile tam teşekküllü C ++ 'a gitmeniz gerekenler.
Dima

Anladım - aslında Meyers tarafından Accelerated C ++ 'dan sonra sıralanan c ++' ı etkin buldum.
yati

1
@Dima "Bu kitabın amacı C ++ 'ı nasıl etkili kullanacağınızı göstermektir. C ++' ı bir dil olarak zaten bildiğinizi ve kullanımında bazı deneyimlerinizin olduğunu kabul ediyorum. Burada sağladığım dili kullanmak için bir rehber yazılımınız anlaşılır, sürdürülebilir, taşınabilir, genişletilebilir, verimli ve beklediğiniz gibi davranması muhtemel. "- Effective C ++. Aynı zamanda okumayı ilginç kılan birkaç “gotchas” ı da kapsar.
Pubby

1
@Dima: Burada dikkatli ol. İkinci baskı, C'den gelen yeni C ++ programcılarını hedefliyordu. (En son) 3. baskı, Java, C # vb. Gibi dillerden gelen programcıları hedefliyor.
sbi

6

Herb Sutter tarafından verilen son YAPI alımını önerebilirim. " Modern C ++ kodu yazma: C ++ yıllar içinde nasıl gelişti? "

Birçok insan, C ++ 'ı üniversitede ya da sadece “C sınıfı” olarak yaşadığı dil olarak düşünür, ancak C ++ dili yıllar içinde yoğun bir şekilde gelişti. Bu oturumda, güç ve performans uygulamaları sunan yenilikçi, etkileyici ve güzel uygulamalar yazmak için C ++ 'ı nasıl kullanabileceğinizi ele alacağız. Yeni bitmiş C ++ 0x standardının C ++ yazmayı diğer diller kadar verimli hale getirebildiğini görmek için bize katılın.

Kötü olmayan bir sunum, çok uzun olmayan, eski standart C / C ++ stilinizi güncellemeniz için size birkaç ipucu verecek en son standarttaki yeni özelliklere dair hoş bir işaret taşıyor.

Bunun dışında, STL'yi öğrenmeniz gerekir - karmaşık değildir ve çok sayıda kitap vardır, örneğin Etkili STL ya da STL dersleri için sizi yönlendirmesi için sadece google.


+1 Teşekkürler. Bu harikaydı. Mutluyum bu soruyu sordum. Pek çok harika linkler :)
yati sagade

4

C ++ ile yaklaşık on yıl çalıştıktan sonra C ++ öğretmeme yardımcı olmak için Accelerated C ++ Andrew Koenig ve Barbara Moo tarafından okudum . (Aslında, o zaman şablon meta-programlama ile uğraşmaya başlamıştım.) Bana dil hakkında herhangi bir yeni gerçeği öğretmediğini düşünmeme rağmen, yine de bir vahiy olarak buldum. 1

Bana öğrettiği şey, C ++ 'a yüksek seviyeli bir dil olarak bakmak ve kullanmaktı. Ham işaretçilerle bağlantı kurmamak ve deletestandart kütüphaneyi mümkün olduğunca kullanmak.

Bunun tam olarak neyin peşinde olduğunu hissediyorum.

1 Bana o zaman öğretecek bir şey kalmadığından değil (on yıl sonra bile bol miktarda var), ancak 250 sayfalık tanıtım kitabına sıkıştırabileceğiniz çok fazla bilgi var.


1

Cevaplamadan önce - bir not: Idiomatic C ++ hareketli bir hedeftir. Dil değiştikçe deyimleri de değişir. Aslında, bazı dil özelliklerinin , dilin kendisinden veya en azından standart kütüphaneden gelen bir destekle basitleştirilebilen veya geliştirilebilen deyimsel kodla başa çıkmamıza izin vermesi amaçlanmıştır . Bu nedenle, herhangi bir kaynağın yalnızca yazarken aptalca olanı hakkında sizi bilgilendirebileceğini unutmayın .

Bunu söyledikten sonra, kontrol etmek için iyi olur:

Codereview.SX sitesi

StackExchange ağı, codereview.stackexchange.com adında bir siteye sahiptir . Bir sınıf C ++ kodu yazdıysanız - bir sınıf, bir kütüphanenin bir parçası, çok büyük olmayan bir şey - oraya gönderebilir ve topluluktan incelemesini isteyebilirsiniz. Kodun derlenmesi ve temelde işlevsel olması gerektiğine dikkat edin - bu site hata ayıklama amaçlı değildir.

Ayrıca, üzerinde çalıştığınız şeyle ilgili bazı C ++ kodları arayabilir ve hakemlerin vurguladığını görebilirsiniz. Hatta bir yanıt göndermeden yayınlanan kodu kendiniz incelemeyi deneyebilir, ardından başkalarının ne düşündüğünü okuyabilirsiniz.

C ++ konferansı video sunumları

Her yıl düzenlenen C ++ 'a odaklanan birkaç geliştirici konferansı var:

ve bunlar sadece onlar değil ... her neyse, her biri bu sunumların çoğunun / hepsinin videolarını yayınladı. Bunlar, bazı deyimsel kodlamalar da dahil olmak üzere, size deyimsel olanın ne olması gerektiğine karar verebileceğiniz ilkeyi içeren bir çok şey öğretecektir .

Bazen konuşmacıların slayt desteğini bile alabilirsiniz.


0

Açık kaynak projeleri çok iyi bir başlangıçtır. Üniversite derslerinize dayalı profesyonel bir programcı olmayı beklemeyin, bunun için tasarlanmamıştır (cevabımı burada yazdığım gibi ).

Sözdiziminin farkında gibi görünüyorsun, bu iyi. Şimdi gidip başkalarının kodunu okuyun ve arkadaş incelemeleri için kendinize katkıda bulunun. Kod okumaktan ve anlamaya çalışmaktan, hata ayıklamaktan ve düzeltmekten ve elbette - orada bulunan kodlama kurallarına uyarak ekleyerek çok şey öğreneceksiniz.

Profesyonel kitaplar da belirtildiği gibi çok iyi bir fikirdir ve StackOverflow hakkındaki soru ve cevaplara göz atmak size çok şey öğretir (kesinlikle bana çok şey öğretir ve kendimi bir C ++ uzmanı olarak görürüm).


-1

Çok iyi C ++ kodu okumak muhtemelen yardımcı olacaktır. Bunu hissetmeye başlamak için kodu görmeniz gerekir. Sonra tekrar, C ++ kodunun çoğu yanlıştır.


"C ++ kodunun çoğu yanlış" - netleştirebilir misiniz? Çoğu OSS projesinin aslında yüksek kalite standartlarını koruduğunu gördüm.
yati

1
Projeler, evet, ancak işlerin nasıl yapılacağına ilişkin googling, genellikle kötü örneklere yol açar.
Kodlayıcı

1
@yati: Benim deneyimim OSS projelerinin tam tersi.
sbi

@sbi belki - Mozilla projesi ve Google Chrome ile ilgilendim (aslında burada değil, ama bir tür öğrenmede yer aldı). Disiplinlerini olağanüstü buldum!
yati

@yatisagade: En azından, varolan en fazla C ++ kodu, dilin bugün iyi kod yazmak için gerekli olan özelliklere sahip olduğu durumlarda yazılmıştı; geri kalanların çoğu, daha eski kodlarla çalışmak üzere yazılmış kütüphaneleri kullanmak zorunda kaldıklarından, bu yeni kodun bir dereceye kadar kendilerine uyarlanması gerekir. Ve tüm bunlar kodlayıcıların düzgün tasarım ve uygulama için gerekli olan zaman ve çabayı harcadıklarından bağımsız olarak ...
einpoklum - Monica
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.