ฉันจะเรียนรู้การเขียนสำนวน C ++ ได้อย่างไร


27

ฉันเป็นนักเรียนวิทยาศาสตร์คอมพิวเตอร์และด้วยเหตุนี้ฉันจึงได้สอน C ++ ในฐานะรุ่น C ที่ดีกว่าด้วยชั้นเรียน ท้ายที่สุดฉันพยายามที่จะบูรณาการวงล้อเมื่อใดก็ตามที่จำเป็นต้องแก้ปัญหาที่ซับซ้อนเพียงเพื่อหาบางครั้งหลังจากนั้นคุณสมบัติภาษาบางอย่างหรือรูทีนไลบรารีมาตรฐานบางอย่างอาจทำเช่นนั้นได้สำหรับฉัน

ฉันทั้งหมดสะดวกสบายกับฉันchar*และ*(int*)(someVoidPointer)สำนวน แต่เมื่อเร็ว ๆ นี้หลังจากการ (เล็กน้อย) มีส่วนร่วมในโครงการที่เปิดแหล่งที่มาผมรู้สึกว่าไม่ได้เป็นวิธีการหนึ่งที่ควรจะคิดว่าเมื่อเขียนรหัส c ++ มันแตกต่างจาก C มาก

เมื่อพิจารณาว่าฉันรู้ว่าการเขียนโปรแกรมเชิงวัตถุค่อนข้างดีและฉันก็โอเคกับเส้นโค้งการเรียนรู้ที่สูงชันคุณจะแนะนำอะไรให้ฉันทำให้ฉันนึกถึงแทร็ก C ++ เมื่อฉันเขียนโค้ด C ++?


7
จากความคิดเห็นของคุณคุณรู้ไวยากรณ์ C ++ และนั่นคือทั้งหมด คุณไม่ได้เข้ารหัสใน C ++ c ++ แท็กใน StackOverflowเป็นสถานที่ที่ดีที่จะเริ่มต้นมันมีรายการอ่านและคำถามที่พบบ่อย วิธีการเรียนรู้วิธีเดียวที่แท้จริงคือการเขียนโค้ดและให้ผู้ใช้ที่มีประสบการณ์แสดงความคิดเห็น คุณสามารถใส่รหัสของคุณที่นี่เพื่อตรวจสอบ ตัวอย่างที่ดี
Martin York

1
นอกเหนือจากคำแนะนำของ @ LokiAstari (ซึ่งฉันเห็นด้วย) ฉันจะบอกว่าเพื่อน ๆ ของคุณถูกต้องและใช้วิธีของคุณผ่านAccelerated C ++อาจเป็นความคิดที่ดี ฉันสงสัยว่าคุณจะพบว่าจำเป็นต้องมีการอ่านข้อมูลน้อยมาก - มันมีไว้สำหรับคนที่อยู่ในตำแหน่งของคุณรู้การเขียนโปรแกรมแล้วและต้องการเรียนรู้สำนวนภาษา C ++ ที่ทันสมัยเป็นหลัก
Jerry Coffin

ใช่จริง ๆ แล้วฉันได้ทำสองบทแรกเสร็จแล้ว แต่สิ่งที่มีอยู่ส่วนใหญ่ที่ฉันรู้อยู่แล้ว - ฉันเข้าใจว่าผู้แต่งจะไม่ออกมาและเขียนหนังสือให้ฉันแม้ว่า :) @LokiAstari ขอบคุณสำหรับความคิดเห็นขั้นสุดยอด :)
yati sagade

3
@yatisagade อย่าคาดหวังว่าหนังสือจะสอนความคิดของภาษาในบทที่สอง มันอาจจะน่าเบื่ออย่างยิ่งเมื่อคุณรู้ไวยากรณ์แล้ว แต่คุณควรผูกมัดตัวเองให้อ่านหนังสือ C ++ สองเล่มอ่านทุกอย่างและทำแบบฝึกหัดแต่ละครั้งเนื่องจากคุณเป็นผู้เริ่มต้นใช้ภาษาทั้งหมด การสอนในทางที่ผิดหมายความว่าคุณต้องพยายามเป็นสองเท่าเพราะคุณต้องลืมความผิดและเรียนรู้สิทธิ (หรืออะไรทำนองนั้น)
yannis

1
ฉันสบายใจกับ [... ] - (int) (someVoidPointer)เคย debugged บิลด์ 64 บิตมาก่อนหรือไม่?
Ed S.

คำตอบ:


12

จากความคิดเห็นของคุณคุณรู้ไวยากรณ์ C ++
คุณไม่ได้เข้ารหัสใน C ++ แต่สิ่งที่มักจะอ้างถึงเป็น C กับคลาส

c ++ แท็กใน StackOverflowเป็นสถานที่ที่ดีที่จะเริ่มต้นมันมีรายการอ่านและคำถามที่พบบ่อย

วิธีการเรียนรู้วิธีเดียวที่แท้จริงคือการเขียนโค้ดและให้ผู้ใช้ที่มีประสบการณ์แสดงความคิดเห็น คุณสามารถใส่รหัสของคุณที่นี่เพื่อตรวจสอบ ตัวอย่างที่ดี

ฉันสบายใจกับ "char *" ของฉัน

หยุดใช้พวกเขาสลับไปที่ std :: string

และ (int) (สำนวน someVoidPointer)

หยุดใช้พวกเขา (นอกเหนือจากการติดต่อกับรหัส C) การใช้แนวคิด functor นั้นมีข้อดีหลายประการ (รวมถึงแนวคิดเรื่องการห่อหุ้มสถานะ)

แต่เมื่อไม่นานมานี้หลังจากมีส่วนร่วมในโครงการ OSS ฉันรู้สึกว่านั่นไม่ใช่วิธีที่คุณคิดใน C ++ มันแตกต่างกันมากแม้ว่า C จะมีที่ของตัวเอง

ใช่. C และ C ++ แตกต่างกันเป็นภาษา แม้ว่าคุณจะสามารถใช้ไวยากรณ์ในทางปฏิบัติเดียวกันสิ่งที่ถือว่าเป็นรหัส C ที่ดีนั้นโดยทั่วไปจะไม่ถือว่าเป็นรหัส C ++ ที่ดี (หรือข้อรอง)

เพื่อนบางคนแนะนำให้เร่งความเร็ว C ++ แต่ฉันรู้อีกครั้งว่าประเภทคืออะไรและชั้นเรียนใดและมีการรับน้ำหนักมากเกินไป

คุณมีพื้นฐานมาก

โปรแกรมเมอร์ C ++ (ซึ่งทำให้เกิดความเสียหาย) สามารถเกิดขึ้นได้อย่างไรซึ่งเกิดขึ้นกับเสียงด้วยแนวคิด OO สามารถเขียนโปรแกรมที่เป็นสำนวนในภาษาได้

ด้วยการทำงานมาก :-)


นี่ไม่ใช่วิธีเดียว คุณสามารถเรียนรู้มากมายจากหนังสือดี
Dima

1
@Dima: แน่นอน คุณสามารถเรียนรู้มากมายจากหนังสือ แต่ไม่มีอะไรจะเอาชนะประสบการณ์และใช้ภาษาด้วยความโกรธล้มเหลวอีกครั้งพยายามล้มเหลวอีกครั้งและหาวิธีที่ดีที่สุดที่จะทำมัน ฉันคิดว่าคุณสามารถเรียนรู้ภาษาฝรั่งเศสจากหนังสือ แต่ฉันสงสัยว่าฝรั่งเศสจะพิจารณาคุณอย่างคล่องแคล่ว
Martin York

6
IMHO วิธีที่มีประสิทธิภาพที่สุดในการเรียนรู้คือการเริ่มต้นกับหนังสือเรียนรู้วิธีที่ถูกต้องในการทำสิ่งต่าง ๆ ลองทำในทางปฏิบัติแล้วมีคนวิจารณ์รหัสของคุณ
Dima

@Dima: ฉันไม่มีข้อโต้แย้ง
Martin York

12

หนังสือEffective C ++สอนสิ่งที่น่าสนใจมากมายและจะนำคุณไปชื่นชมคุณสมบัติของ C ++ นอกจากนี้ยังมีประสิทธิภาพ STL - ฉันไม่ได้อ่าน แต่ฉันแน่ใจว่ามันจะเป็นการอ่านที่ยอดเยี่ยมหากคุณไม่คุ้นเคยกับ STD

สิ่งสำคัญที่ต้องเรียนรู้คือการที่คุณควรจะทำให้การใช้ภาษาและไม่ได้บูรณาการล้ออย่างต่อเนื่อง คุณได้เรียนรู้วิธีการทำให้พวกเขาแล้วทำให้มันเป็นเรื่องง่ายสำหรับตัวคุณเอง (และคนอื่น ๆ !) และใช้เครื่องมือเพื่อศักยภาพของพวกเขา

ในฐานะที่เป็นบันทึกด้านข้างคุณจะพบกับผู้คนจำนวนมากที่ต้องการใช้ STD นี่เป็นเพียงความคิดที่ไม่ดีเท่าการใช้งานเท่านั้นchar*- บางครั้งมันไม่ใช่เครื่องมือที่ถูกต้องและมีสิ่งอื่นอีกมากมาย ในทำนองเดียวกันอย่าท้อถอยจากการสร้างคลาสตู้สินค้าของคุณเอง - ถ้าคุณกำลังจะใช้char*สถานที่ที่ดีที่สุดในการทำมันก็จะถูกห่อไว้อย่างปลอดภัยภายในชั้นเรียน


ฉันรู้เกี่ยวกับซีรีย์ที่มีประสิทธิภาพ (ยังไม่ได้อ่าน) - แต่ฉันคิดว่ามันเป็นปัญหาการฝึกฝนที่ดีที่สุดใช่มั้ย
yati sagade

3
@yati sagade: ไม่หนังสือเหล่านี้เป็นสิ่งที่คุณต้องทำตั้งแต่ "C กับคลาส" ไปจนถึง C ++ ที่เต็มเปี่ยม
Dima

ฉันเห็น - จริง ๆ แล้วฉันมี c ++ ที่มีประสิทธิภาพโดย Meyers เรียงกันหลังจาก Accelerated C ++
yati sagade

1
@Dima "จุดประสงค์ของหนังสือเล่มนี้เพื่อแสดงให้คุณเห็นวิธีการใช้ C ++ อย่างมีประสิทธิภาพฉันคิดว่าคุณรู้ภาษา C ++ แล้วและคุณมีประสบการณ์ในการใช้งานบ้างสิ่งที่ฉันให้ไว้ที่นี่เป็นแนวทางในการใช้ภาษาเพื่อ ซอฟต์แวร์ของคุณสามารถเข้าใจได้บำรุงรักษาพกพาขยายได้มีประสิทธิภาพและมีแนวโน้มที่จะทำงานตามที่คุณคาดหวัง "- C ++ ที่มีประสิทธิภาพ นอกจากนี้ยังครอบคลุม "gotchas" จำนวนหนึ่งซึ่งทำให้อ่านน่าสนใจ
Pubby

1
@Dima: ระวังที่นี่ รุ่นที่ 2 มีวัตถุประสงค์เพื่อโปรแกรมเมอร์ C ++ ใหม่ที่มาจาก C. รุ่นที่ 3 (ล่าสุด) มุ่งเน้นที่โปรแกรมเมอร์ที่มาจากภาษาเช่น Java, C # ฯลฯ
sbi

6

ฉันสามารถแนะนำ BUILD ล่าสุดที่ Herb Sutter ให้มา หนึ่งเรียกว่า " การเขียนรหัส C ++ ที่ทันสมัย: วิธี C ++ มีการพัฒนากว่าปี ":

หลายคนคิดว่า C ++ เป็นภาษาเดียวกับที่พวกเขาเคยเรียนในวิทยาลัยหรือเหมือนกับ“ C กับชั้นเรียน” แต่ภาษา C ++ นั้นมีการพัฒนาอย่างกว้างขวางในช่วงหลายปีที่ผ่านมา ในเซสชั่นนี้เราจะกล่าวถึงวิธีการที่คุณสามารถใช้ C ++ เพื่อเขียนแอพที่เป็นนวัตกรรมแสดงออกและสวยงามที่นำเสนอแอพพลิเคชั่นพลังและประสิทธิภาพ เข้าร่วมกับเราเพื่อดูว่ามาตรฐาน C ++ 0x ที่เสร็จสิ้นใหม่สามารถทำให้การเขียน C ++ มีประสิทธิภาพเหมือนภาษาอื่น ๆ มากมายได้อย่างไร

มันไม่ใช่งานนำเสนอที่ไม่ดีไม่นานมีตัวชี้ที่ดีสำหรับคุณสมบัติใหม่ในมาตรฐานล่าสุดซึ่งจะให้คำแนะนำเล็กน้อยต่อการปรับปรุงสไตล์ C / C ++ เก่าของคุณ

นอกเหนือจากนั้นคุณต้องเรียนรู้ STL - มันไม่ซับซ้อนและมีหนังสือมากมายเช่น Effective STL หรือ google สำหรับบทเรียน STL เพื่อให้คุณไป


+1 ขอบคุณ นั่นวิเศษมาก ฉันดีใจที่ฉันถามคำถามนี้ การเชื่อมโยงที่ยอดเยี่ยมมากมาย :)
yati sagade

4

ฉันอ่านAccelerated C ++โดย Andrew Koenig และ Barbara Moo เพื่อช่วยฉันสอน C ++ หลังจากทำงานกับ C ++ มาเกือบทศวรรษ (ในความเป็นจริงฉันเริ่มที่จะมีคนจรจัดกับการเขียนโปรแกรมเมตาเทมเพลตในเวลานั้น) ฉันยังพบว่ามันเป็นการเปิดเผยแม้ว่าฉันไม่คิดว่ามันจะสอนข้อเท็จจริงใหม่เกี่ยวกับภาษาให้ฉันก็ตาม 1

แต่สิ่งที่สอนฉันคือการมองและใช้ภาษา C ++ เป็นภาษาระดับสูง เพื่อไม่ให้คนจรจัดกับพอยน์เตอร์ดิบและdeleteและใช้ไลบรารีมาตรฐานทุกที่ที่ทำได้

ฉันมีความรู้สึกว่านี่คือสิ่งที่คุณเป็นอย่างแท้จริง

1 ไม่ใช่ว่าไม่มีอะไรเหลือให้สอนฉันตั้งแต่นั้นมา (ตอนนี้ยังมีอีกมากในอีกสิบปีต่อมา) แต่มีเพียงความรู้มากมายที่คุณสามารถบีบลงในหนังสือเกริ่นนำ 250 หน้า


1

ก่อนที่จะตอบ - หมายเหตุ: Idiomatic C ++ เป็นเป้าหมายเคลื่อนที่ เมื่อภาษามีการเปลี่ยนแปลง ในความเป็นจริงแล้วฟีเจอร์ภาษาบางอย่างนั้นมีจุดประสงค์เพื่อให้เราสามารถใช้รหัสสำนวนซึ่งอาจง่ายหรือปรับปรุงด้วยการสนับสนุนจากภาษาเองหรืออย่างน้อยไลบรารีมาตรฐาน ดังนั้นจำไว้ว่าแหล่งใดสามารถแจ้งให้ทราบเกี่ยวกับสิ่งที่เป็นสำนวนที่เวลาของการเขียน

ต้องบอกว่าคุณจะทำดีเพื่อตรวจสอบ:

ไซต์ codereview.SX

StackExchange เครือข่ายมีเว็บไซต์ชื่อcodereview.stackexchange.com หากคุณเขียนโค้ด C ++ หนึ่งชิ้น - คลาสซึ่งเป็นส่วนหนึ่งของห้องสมุดสิ่งที่ไม่ใหญ่โตเกินไปคุณสามารถโพสต์ไว้ที่นั่นและขอให้ชุมชนทำการตรวจสอบ โปรดทราบว่ารหัสจะต้องรวบรวมและใช้งานได้โดยทั่วไป - ไซต์นั้นไม่ได้มีไว้สำหรับการดีบัก

นอกจากนี้คุณสามารถค้นหารหัส C ++ บางอย่างที่นั่นเกี่ยวข้องกับสิ่งที่คุณกำลังทำอยู่และดูว่าผู้ตรวจสอบเน้นอะไร คุณสามารถลองทบทวนโค้ดที่โพสต์เองได้โดยไม่ต้องโพสต์คำตอบจากนั้นอ่านสิ่งที่คนอื่นคิด

งานนำเสนอวิดีโอการประชุม C ++

มีการประชุมนักพัฒนาหลายครั้งที่เน้นที่ C ++ ซึ่งจัดขึ้นทุกปี:

  • CppCon
  • CppNow
  • ACCUแม้ว่าจะไม่ใช่ C ++ - เฉพาะ

และสิ่งเหล่านี้ไม่ได้เป็นเพียงรายการเดียว ... อย่างไรก็ตามแต่ละวิดีโอโพสต์เหล่านี้มีการนำเสนอจำนวนมาก / ทั้งหมด สิ่งเหล่านี้จะสอนคุณมากมายรวมถึงการเขียนรหัสและหลักการที่คุณสามารถตัดสินใจได้ว่าควรหรือไม่ควรใช้สำนวน

บางครั้งคุณสามารถรับแท่นสไลด์ของลำโพง


0

โครงการโอเพ่นซอร์สเป็นการเริ่มต้นที่ดีมาก อย่าคาดหวังว่าจะเป็นโปรแกรมเมอร์มืออาชีพจากชั้นเรียนในมหาวิทยาลัยของคุณพวกเขาไม่ได้ตั้งใจทำอย่างนั้น (อย่างที่ฉันเขียนไว้ในคำตอบของฉันที่นี่ )

ดูเหมือนว่าคุณจะรับรู้ถึงไวยากรณ์ที่ดี ตอนนี้ไปและอ่านรหัสของผู้อื่นและมีส่วนร่วมของคุณเองสำหรับความคิดเห็นของเพื่อน คุณจะได้เรียนรู้มากมายจากการอ่านรหัสและพยายามทำความเข้าใจแก้จุดบกพร่องและแก้ไขมันและแน่นอน - เพิ่มเข้าไปในการปฏิบัติตามข้อกำหนดการเข้ารหัสที่มีอยู่แล้ว

หนังสือมืออาชีพเป็นความคิดที่ดีมากตามที่กล่าวไว้และการสืบค้นคำถามและคำตอบเกี่ยวกับ StackOverflow จะสอนคุณมากมาย (แน่นอนว่ามันสอนฉันได้มากและฉันคิดว่าตัวเองเป็นมืออาชีพ C ++)


-1

การอ่านรหัส C ++ ที่ดีมากอาจช่วยได้ คุณต้องเห็นรหัสเพื่อเริ่มรับความรู้สึกของมัน จากนั้นอีกครั้งรหัส C ++ ส่วนใหญ่ผิด


"รหัส C ++ ส่วนใหญ่ผิด" - คุณช่วยอธิบายได้ไหม? ฉันเห็นแล้วว่าโครงการ OSS ส่วนใหญ่รักษามาตรฐานคุณภาพสูงไว้
yati sagade

1
โปรเจ็กต์ใช่ แต่ googling ในการทำสิ่งต่าง ๆ มักจะนำไปสู่ตัวอย่างที่ไม่ดี
Coder

1
@yati: ประสบการณ์ของฉันคือโครงการ OSS ที่ตรงกันข้าม
sbi

@sbi อาจ - ฉันเกี่ยวข้องกับโครงการ Mozilla และ Google Chrome (ไม่เกี่ยวข้องกับที่นี่จริง ๆ แต่เป็นการเรียนรู้) พบว่ามีระเบียบวินัยที่โดดเด่น!
yati sagade

@yatagagade: อย่างน้อยที่สุดโค้ด C ++ ที่มีอยู่ส่วนใหญ่จะถูกเขียนเมื่อภาษามีคุณสมบัติที่จำเป็นในการเขียนโค้ดที่ดีในปัจจุบัน และส่วนที่เหลือเขียนโดยใช้ห้องสมุดที่เขียนขึ้นเพื่อทำงานกับโค้ดเก่าดังนั้นรหัสใหม่นี้จะต้องปรับให้เข้ากับพวกเขาในระดับหนึ่ง และทั้งหมดนี้คือไม่คำนึงถึงว่าโคดลงทุนเวลาและความพยายามที่จำเป็นสำหรับการออกแบบที่ดีและการดำเนินการ ...
einpoklum - คืนสิทธิ์ให้กับโมนิกา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.