รับ C ++ '11 ได้รับการอนุมัติการเปลี่ยนแปลงนี้จะเป็นวิธีเริ่มต้น C ++ เรียนรู้ภาษาหรือไม่ [ปิด]


21

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

คำถามของฉันคือ: เนื่องจาก C ++ '11 ได้รับการอนุมัติ (แม้ว่าฉันรู้ว่ายังไม่ได้ใช้งานอย่างสมบูรณ์) สิ่งนี้เปลี่ยนวิธีที่ฉันควรเข้าใกล้การเรียนรู้ C ++ หรือไม่ ฉันเป็นเจ้าของC ++: การอ้างอิงที่สมบูรณ์โดย Herb Schildtซึ่งมาจากปี 1998 มาตรฐานที่เพิ่งได้รับการอนุมัติทำให้การเรียนรู้จากหนังสือดังกล่าวมีความสำคัญน้อยกว่าบทเรียน / หนังสือใหม่ที่มีเนื้อหาจากมาตรฐานหรือไม่? มีประโยชน์ใด ๆ จากการเรียนรู้จากหนังสือเก่าหรือไม่?


9
OOF Schildt ฉันไม่สามารถพูดกับคุณภาพของวัสดุ C ++ ของเขาได้ แต่วัสดุ C ของเขานั้นมีมาตรฐานต่ำเป็นเวลานาน (แม้กระทั่ง C: รุ่นล่าสุดของ TCR ยังคงมีข้อผิดพลาดเล็กน้อยอยู่เล็กน้อย) ฉันขอแนะนำให้มองหางานที่เป็นปัจจุบันมากขึ้นโดยผู้เขียนคนอื่น
John Bode

C ++ 11 ไม่ได้เปลี่ยนพื้นฐานของ C ++ ซึ่งจะต้องเรียนรู้เพื่อที่จะทำสิ่งใดก็ตามที่นำมาใช้ในการแก้ไขครั้งล่าสุดและไม่มีอยู่ใน C ++ รุ่นก่อนหน้า
Ramhound

11
อย่าเชื่อถือหนังสือโดย Herb Schildt จริงๆแล้วในขณะที่หนังสือ C ++ ส่วนใหญ่มีหนังสือที่ไม่ดี (และฉันไม่ได้หมายถึงปัญหาโวหารที่นี่ แต่ข้อผิดพลาดจริงที่เห็นได้ชัดและการส่งเสริมรูปแบบการเขียนโปรแกรมที่รู้จักกันดีเพื่อนำไปสู่รหัสบั๊ก) หนังสือของ Schildt ชื่อของเขากลายเป็นเหมือนมีม
sbi

4
@ แรมฮาวด์: ฉันไม่เห็นด้วย หากนั่นเป็นความจริงเราทุกคนยังคงเรียนรู้การจัดการทรัพยากรด้วยตนเองก่อนแล้วจึงมีวิธีที่ปลอดภัยกว่าในการทำทรัพยากรแบบไดนามิก โชคดีที่การเปลี่ยนแปลงนี้ (ช้า) ความเป็นไปได้ใหม่ ๆ แม้ว่าจะเป็น "เฉพาะ" ในห้องสมุดให้เรียกใช้สำนวนใหม่ หากคุณเริ่มต้นด้วยภาษาทำไมเรียนรู้สำนวนที่เก่ากว่าก่อนเท่านั้นที่จะต้องทำให้เข้าใจผิดในภายหลัง
sbi

คำตอบ:


16

อย่างแน่นอน วันนี้สามสิ่งที่มักจะอยู่ในบทที่ 2 ควรเคลื่อนไหวมากในภายหลัง:

  • สตริงเป็นอาร์เรย์ของถ่าน *, strlen, strxxx วิธีการและอื่น ๆ
  • อาร์เรย์โดยทั่วไปและตัวชี้เลขคณิต
  • ลบสิ่งที่คุณใหม่ลบ [] สิ่งที่คุณใหม่ [] และแม้แต่ destructors

สิ่งเหล่านี้ซึ่งโดยปกติแล้วจะอยู่ในบทที่ 99 ควรมีความก้าวหน้ามาก

  • เทมเพลตเป็นสิ่งที่ต้องใช้ (เขียนไม่มาก)
  • มาตรฐาน :: สตริง
  • มาตรฐาน :: shared_ptr <>
  • std :: vector <> ตัววนซ้ำคอลเลกชันอื่น ๆ

ควรให้ตัวชี้ raw ของ Evey กับตัวชี้สมาร์ทแวปเปอร์ทันที (ฉันจะเริ่มด้วยการแบ่งใช้และพิจารณาที่ไม่ซ้ำกันในภายหลังเนื่องจากต้องอธิบาย std :: move และการอ้างอิงค่า rvalue) การทำเช่นนี้จะทำให้การเรียนรู้ C ++ รู้สึกเหมือนการเรียนรู้ Java หรือ C # ที่คุณเรียนรู้ห้องสมุดในเวลาเดียวกันกับภาษา มันจะใช้ความทรงจำมากมายเช่นกันและทำให้ผู้คนกังวลน้อยลงเกี่ยวกับ gotchas

ฉันยังจะใช้ลูกแกะในภาพเป็นครั้งแรกที่เราต้องการทำซ้ำผ่านคอลเลกชันและทำบางสิ่งบางอย่างกับองค์ประกอบแต่ละอย่าง

ข้อจำกัดความรับผิดชอบ: ฉันกำลังเขียนหลักสูตร C ++ สำหรับ Pluralsight ในขณะนี้และใช้วิธีการนี้ โมดูลสุดท้ายคือ "การทำความเข้าใจโค้ดของคนอื่น" และนั่นคือที่ที่ฉันจะทำให้สิ่งที่สับสนเช่นสตริง char * การจัดการหน่วยความจำด้วยตนเองเลขคณิตตัวชี้และอื่น ๆ

อัปเดต:มีบางคนถามว่าทำไมการมีอยู่ของ C ++ 0x เป็นแรงบันดาลใจในการสอนสิ่งต่าง ๆ ที่สามารถสอนด้วย C ++ 03 ฉันคิดว่ามันมีหลายสิ่ง:

  • พอยน์เตอร์อัจฉริยะอย่างแท้จริงที่เป็นมิตรกับการสะสมนำความต้องการสิ่งต่าง ๆ เช่น "อาเรย์ของพอยน์เตอร์ของพนักงาน" ที่ทำให้เรากลับมาใหม่ / ลบตัวชี้เลขคณิตเป็นต้น
  • อัตโนมัตินำความเจ็บปวดจากการประกาศตัววนซ้ำ
  • lambdas ทำสิ่งต่าง ๆ ที่คนธรรมดาจะทำ
  • แม้กระทั่งบางสิ่งที่ไม่สำคัญเท่าการวิเคราะห์คำ>>อย่างถูกต้องก็จะกำจัด gotcha ที่จะเกิดขึ้นเมื่อประกาศแม่แบบบางอย่าง
  • และอื่น ๆ

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


3
ทำไมคุณถึงรู้สึกว่าควรสอนการจัดการหน่วยความจำด้วยตนเองในภายหลัง ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะรู้และให้ความชื่นชมมากขึ้นเมื่อเรียนรู้พอยน์เตอร์ที่ชาญฉลาด ฉันต้องเรียนรู้การจัดการหน่วยความจำ (และอาร์เรย์อาร์เรย์) ใน C และทำให้ฉันรู้สึกขอบคุณ RAII และ std :: สตริงมากกว่าที่ฉันคิดว่าฉันจะทำถ้าฉันไม่ต้องทำ
Jetti

1
ตัวอย่างของคุณส่วนใหญ่ใช้กับ C ++ 98 เทียบกับ C ++ ก่อนมาตรฐานไม่ใช่ C ++ 03 เทียบกับ C ++ 11 ฉันคิดว่าแลมบ์ดาที่ได้รับstd::for_each()จะได้รับความนิยมมากกว่าที่เคยเป็นautoจะมีความสำคัญมากและไวยากรณ์การประกาศฟังก์ชั่นใหม่ (ร่วมกับdecltype) จะถูกใช้ในแม่แบบรหัสค่อนข้างมาก นี่คือสิ่งที่ไม่มีหนังสือ C ++ สอนในปัจจุบัน แต่โดยทั่วไปแล้วฉันเห็นด้วยกับคุณ ( +1) เมื่อฉันเริ่มให้หลักสูตร C ++ ฉันเริ่มต้นด้วยAccelerated C ++และแม้ว่าหลักสูตรของฉันเริ่มเบี่ยงเบนไปจากหลักสูตรมากขึ้นเรื่อย ๆ แต่ก็ยังคงยึดมั่นในหลักการพื้นฐาน
sbi

3
@Jetti: ฉันไม่ค่อยเคยจัดการทรัพยากรแบบแมนนวลและถ้าฉันทำมันก็เพื่อการใช้คลาส RAII อย่างไรก็ตามฉันใช้คลาสเหล่านั้นหลายคลาส ตามที่กล่าวมาการใช้งานของ RAII ดูเหมือนว่าสำคัญกว่าการจัดการกับทรัพยากรดิบและควรได้รับการสอนก่อนหน้านี้โดยเน้นมากขึ้น
sbi

1
@sbi: ฉันต้องเห็นด้วยกับคุณ - ตัวอย่างเหล่านี้ส่วนใหญ่ดูเหมือน Modern C ++ 101 จากปี 2006 ไม่ใช่อะไรใหม่เกี่ยวกับ C ++ 11
DeadMG

2
@Jetti: ขั้นตอนที่สำคัญที่สุดในการเรียนรู้ C ++ คือการเรียนรู้วิธีการทั้งหมดที่คุณสามารถหลีกเลี่ยงการจัดการหน่วยความจำด้วยตนเอง มันเป็นสิ่งที่ควรสอน "ภายหลัง" เมื่อคุณได้เรียนรู้ว่าคุณสามารถจัดการหน่วยความจำ "อัตโนมัติ" ได้ไกลแค่ไหน
jalf

9

ค่อนข้างดีใช่ ความจริงง่ายๆคือใน C ++ 98 และ 03 การปฏิบัติที่ดีหลายอย่างนั้นไม่สามารถใช้งานได้เพราะขาดการสนับสนุนด้านภาษาเช่นการเขียนโปรแกรมที่ใช้งานได้ ตอนนี้แลมบ์ดามีอยู่และทำงานได้ผู้คนมักจะยอมรับอินเตอร์เฟสการใช้งานที่ดีกว่าที่เคยเป็นมาและการเขียนโปรแกรมทั่วไปก็แข็งแกร่งกว่าเดิม

ในปี 1998 ผู้คนเพิ่งเริ่มค้นพบวิธีการเขียนคุณภาพสูงปลอดภัยรหัสรวดเร็วโดยใช้ C ++ และรหัสจำนวนมากคือ "C คือคลาส" ใน C ++ 11 มีความแตกต่างกันอย่างมากเช่นการคัดลอกและสลับและกฎของสาม (ตอนนี้ห้า) เป็นที่รู้จักและได้รับการยอมรับและการจัดการทรัพยากรประเภทอื่น ๆ ได้กลายเป็นมาตรฐานเหมือนshared_ptrและunique_ptrที่มาตรฐานก่อนหน้านี้ทิ้งไว้ เป็นหลุมที่อ้าปากค้าง

คุณสามารถดูคำถามนี้สำหรับรายการวัสดุอ้างอิงที่ยอดเยี่ยมใน C ++


1
อันที่จริงฉันจะเริ่มต้นจุดสิ้นสุดของ "C กับคลาส" ไม่กี่ปีก่อนหน้า 1998 แต่โดยทั่วไปคุณมีสิทธิ์อย่างแน่นอนและฉันจะไม่ต่อรองมากกว่าครึ่งทศวรรษ +1จากฉัน.
sbi

4

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

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

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

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


ขอบคุณ! คุณรู้จักแหล่งข้อมูลออนไลน์หรือหนังสือดี ๆ แล้วหรือยัง?
Jetti

2
ไม่ไซต์ cplusplus มักถูกกล่าวถึงว่าเป็นทรัพยากรที่ไม่ควรถูกเรียกว่าเป็นใครก็ตามที่คุณต้องการจะเขียนโค้ดที่ดี
DeadMG

@DeadMG คุณมีเว็บไซต์อื่นหรือไม่?
TheLQ

@TheLQ: คุณจะได้รับต่อไปด้วยการอ้างอิง MSDN cprogramming.comหรือ
DeadMG

@Jetti: ฉันไม่ทราบถึงเนื้อหาใด ๆ สำหรับการใช้ C ++ 11 เพื่อสอน C ++ ทุกสิ่งที่ฉันได้เห็นสอน C ++ 11 ที่ด้านบนของ C ++ 03 สำหรับการเรียนรู้ดูหลังstackoverflow.com/questions/388242/...
sbi

3

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

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


ขอบคุณสำหรับคำตอบของคุณฉันคิดว่าอย่างน้อยก็จะช่วยให้ฉันดูรหัสเก่าเมื่อใช้ทรัพยากรเก่า
Jetti

แลมบ์ดาautoและฟังก์ชั่นอะซิงโครนัสทำอะไรได้นอกจาก "โยกเรือ"
sbi

1
ฉันเถียงว่ามีความแตกต่างระหว่างการแนะนำของเครื่องมือใหม่และการเปลี่ยนแปลงในวงกว้างในปรัชญาการออกแบบ (เหมือนที่เราเห็นด้วย PHP ตัวอย่างเช่น)
สิงห์

1
@leo: ฉันไม่เห็นด้วย การแนะนำ STL ตัวชี้อัจฉริยะและสิ่งอำนวยความสะดวกแม่แบบที่หลากหลายได้เปลี่ยนแปลงปรัชญาการออกแบบกระแสหลักของ C ++ โดยสิ้นเชิง เพียงเกี่ยวกับทุกห้องสมุดเพิ่มที่แตกต่างกันโดยสิ้นเชิงจาก C เฉลี่ยของคุณ ++ ห้องสมุด 90ies
sbi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.