C ++ สำหรับนักพัฒนา C #


24

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

MSDN มีการเปรียบเทียบแต่ไม่ลึกมาก

ฉันสามารถแยกแหล่งที่มาหลายแห่งด้วยกัน แต่คิดว่ามีบางอย่างอยู่ข้างนอก - ฉันแค่หามันไม่เจอ ขอบคุณสำหรับความช่วยเหลือของคุณ.


27
ทำไม "เศร้า"? อย่าทำให้ตัวคุณผิดหวังแบบนั้น ฉันไม่รู้จักผู้พัฒนา C # ที่ไม่ได้เรียนรู้ด้วยตนเอง ซึ่งหลายคนเป็นนักพัฒนาที่น่าทึ่ง
Steven Evers

6
@SnOrfus - ส่วนใหญ่เป็นเพราะสถาบันการศึกษาหลีกเลี่ยงเหตุผลทางการเมืองหลอก
Rei Miyasaka

5
คำแนะนำแรกของฉันคืออย่าพยายามเรียนรู้ C ++ ในบริบทของ C # เนื่องจาก C # ไม่ใช่ C ++ และ C ++ ไม่ใช่ C # นั่นอาจเป็นคำสั่งที่โง่ที่จะทำ แต่ C # ทำให้มันยากที่จะทำพอยน์เตอร์ผิดและมันง่ายมากที่จะทำมันผิดใน C ++ แม้จะมีเครื่องมือที่ทำให้มันง่ายจริง ๆ ฉันจะเพิ่มมีหลายสิ่งที่ทั้งสองภาษามีร่วมกัน โดยพื้นฐานแล้วมันก็เหมือนกับการบอกว่าทั้ง Apple และ Orange นั้นปลูกบนต้นไม้และมีเมล็ด
Ramhound

2
@ReiMiyasaka ไม่เหมือนที่นักพัฒนา C # ดูที่ VB .NET
Kyralessa

1
@Kyralessa ซึ่งเป็นโชคร้ายเช่นกัน ฉันคิดว่ามันไม่ได้เป็นปัญหาทางการเมืองมากนักเนื่องจากมีความโน้มเอียงที่มีต่อกลุ่มประชากร VB.NET - เพราะผู้เริ่มต้น C # ส่วนใหญ่มีพื้นหลัง C / C ++ โรงเรียนของฉันใช้ VB.NET เป็นหลักสูตรเริ่มต้น ดูเหมือนว่าพวกเขาคิดว่า VB.NET เป็นของเล่นและไม่ควรขัดกับความคิดของนักเรียนอย่างที่ C # เป็น
Rei Miyasaka

คำตอบ:


10

หัวข้อนี้ใน C ++ สำหรับนักพัฒนา Java จะคล้ายกันมากและควรจะมีประโยชน์โดยเฉพาะโพสต์ Mark Byer:

อ่านหนังสือเหล่านี้:

น่าจะเป็นสิ่งสำคัญที่สุดที่จะเก็บไว้ในใจคือการเข้าใจความแตกต่างในเทคนิคการจัดการหน่วยความจำระหว่าง C # / Java และซี

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


4
น่าเสียดายที่ไม่มีใครใน C ++ ใช้char[]แล้วใช่ไหม
DeadMG

5
@DeadMG ฉันไม่เห็นจุดของคุณ เพียงเพราะchar[]ไม่ค่อยได้ใช้ใน C ++ ไม่ได้หมายความว่าไม่ได้สอนหรือว่าไม่ควรสอน char[]ยังคงมีความสำคัญที่ต้องระวังเพราะ C ++ เป็นชุดของ C และมันจำเป็นที่จะต้องเข้าใจอย่างถูกต้องหากจะต้องเรียนรู้เลย
Rei Miyasaka

7
ใช่ - เป็นเวลานานมากหลังจากพวกเขาเชี่ยวชาญเกี่ยวกับภาษาอื่น ๆ ฉันอยากสอนนักเรียนใหม่เป็นแม่แบบเฉพาะทางและ SFINAE ใน C ++ คุณใช้std::stringและถ้าคุณต้องทำงานร่วมกับ C API นั่นก็เพื่อสิ่งc_str()นั้น โปรแกรมเมอร์ไม่จำเป็นต้องจัดการกับchar[]หรือการยกเลิก NULL ในที่ใด ๆ การจัดการสตริง C-สไตล์อย่างสมบูรณ์และอย่างเต็มที่และทั้งหมดที่เลิกใช้งานทุกครั้งที่เป็นไปได้ยกเว้นการทำงานร่วมกันด้วยรหัส C c_str()เก่าซึ่งเป็นที่ที่ดีที่สุดที่ได้รับการจัดการอย่างดีจาก
DeadMG

4
ไม่มีสิ่งเช่นการสอนที่char[]ถูกต้องเพราะการใช้ทั้งหมดchar[]นั้นผิด อาจารย์ของคุณอาจจะดีอย่างแน่นอนถ้าเขาติดอยู่กับ C ++ แทน C
DeadMG

4
คุณจะเห็นรหัส C ที่ใช้ใน C ++ ไม่ว่าคุณจะเขียน C หรือไม่ใช่ตัวคุณเองและดังนั้นหากคุณเรียนรู้ C ++ คุณจะต้องเรียนรู้ C ดังที่ฉันได้กล่าวไปแล้วว่าฉันไม่เอาผิด แต่ความจริงของ เรื่องก็คือว่าโดยทั่วไปโรงเรียนสอน C แล้วตะปูใน c ++ ต่อมาเพราะนักเรียนจะต้องมีการสอนสิ่งต่างๆเช่นการออกแบบระบบปฏิบัติการ - ซึ่งไม่รวม BeOS และระบบปฏิบัติการวิจัยบางอย่างต้องใช้ซีเพื่อที่คุณจะทำต้องเข้าใจสตริง C อีกครั้งเป็นครั้งที่สามถ้าฉันมีวิธีของฉันฉันจะไม่สอน C ++ ให้กับนักเรียนปีแรกและเป็นครั้งสุดท้ายนั่นคือสิ่งที่นอกเหนือจากประเด็นทั้งหมด
Rei Miyasaka

14

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


3
นั่นจะอธิบายว่าทำไมไม่มีอะไรออกมามากมาย หลังจากอ่านบน C ++ แล้วมันจะปรากฏว่าคุณถูกต้อง - เป็นโลกที่แตกต่างอย่างสิ้นเชิง ขอบคุณสำหรับความช่วยเหลือของคุณ.
Mark Williams

1
+1 มีน้อยที่คุณจะรู้เกี่ยวกับ C # ที่สามารถถ่ายโอนจากระยะไกลไปยัง C ++ได้ ฉันเรียนรู้วิธีนี้อย่างหนัก
ApprenticeHacker

เป็นจุดที่รวดเร็วฉันจะบอกว่ามี C ++ มากมายที่เป็นพื้นฐาน การแยกความแตกต่างของพอยน์เตอร์ / การอ้างอิงและเทมเพลต C ++ สามารถทำให้หัวของคุณหมุนได้ในตอนแรก แต่เมื่อมันลงมายังคงมีคลาสcoutและวิธีการที่ง่ายต่อการบรรลุเป้าหมายที่เรียบง่าย
Kieren Johnstone

1
@ KierenJohnstone: คุณอาจหมายถึง "วิธีที่ช้าและไม่ปลอดภัยในการทำสิ่งต่าง ๆ " เช่น "การสลายตัวของอาเรย์ต่อตัวชี้" และสิ่งต่าง ๆ
DeadMG

12
คำตอบที่ไม่ช่วยเหลือดีอย่างสมบูรณ์
dbracey

9

ไม่มีการแก้ไขที่ง่ายสำหรับเรื่องนี้ C ++ ไม่ใช่เรื่องยากโดยเฉพาะ แต่ไม่ใช่เรื่องง่ายสำหรับผู้เริ่มต้น

ฉันขอแนะนำให้อ่านพื้นฐานของการเขียนโปรแกรม C (เพื่อให้ได้ข้อมูลพื้นฐานในระดับต่ำที่คุณจะพบ) จากนั้นเรียนรู้ STL ตามด้วยบทความจากไลค์ Meyers นี่คือหนึ่งในการเริ่มต้นให้คุณเพราะมันแสดงให้เห็นว่าคุณควรจะเขียน C ++ ที่ทันสมัยอย่างไรเมื่อเปรียบเทียบกับ C-with-classes


2
+1: ฉันต้องการเพิ่มหนังสือของเมเยอร์ (ซีรีย์ C ++ / STL ที่มีประสิทธิภาพ) ฉันได้รับพวกเขาทั้งหมดและพวกเขายอดเยี่ยม
Steven Evers

12
reading up on C programming-1 ฉันคิดว่านี่จะเป็นอันตรายมากกว่าดีและ coveys ความคิดที่ว่า C และ C ++ เป็นภาษาที่ต้องศึกษาด้วยกัน
sebastiangeiger

2
@sebastiangeiger: คุณพลาดจุดที่เมื่อต้องทำงานกับแอพพลิเคชั่น C ++ ที่มีอยู่จริงคุณจะต้องจัดการกับโครงสร้าง C-like เหมือนกัน ดังนั้นอย่างน้อย +1 เพื่อกำจัด downvote ของคุณ
Doc Brown

5
@DocBrown บางที แต่ฉันเป็นหนึ่งในโครงการมรดก C ++ ในขณะนี้และฉันสามารถบอกได้ว่ารุ่นก่อนของฉันส่วนใหญ่เป็นเพียงโปรแกรมเมอร์ C ที่บันทึกไฟล์ต้นฉบับเป็น * .cpp ฉันพบว่าฉันใช้น้อยกว่ามากdeleteและอาร์เรย์ C และสิ่งอื่น ๆ ที่ท้อแท้ใน C ++ มากกว่าที่พวกเขาทำซึ่งฉันเชื่อว่าการไม่ศึกษาอย่างชัดเจน C. C ค่อนข้างง่ายคุณสามารถเข้าใจได้อย่างรวดเร็วว่าโค้ดทำอะไร
sebastiangeiger

3
@gbjaanb: ไม่มีอะไรที่ทุกคนเกี่ยวกับ STL ที่ต้องรู้และmalloc freeC ++ dev ที่ยอดเยี่ยมในที่สุดจะต้องการทราบเกี่ยวกับพวกเขา เริ่มต้นกับพวกเขาเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
DeadMG

7

ฉันไม่แน่ใจว่าคุณยังมองหาวัสดุอยู่หรือไม่ฉันพบบทความนี้เมื่อไม่กี่เดือนที่ผ่านมา มันไม่ใช่หนังสือ (เพียง 53 หน้า) การแนะนำบอกว่ามันทั้งหมด:

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

และยังมีโพสต์อัพเดทด้วย:

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

เรียนรู้ที่มีความสุข :)


ระวังให้มากเมื่อใช้เอกสารนี้มันจะแสดง C ++ ในลักษณะที่เป็นศูนย์กลางของ Microsoft มันไม่ได้แยกความแตกต่างระหว่างคุณสมบัติ C ++ 03 และ C ++ 11 และบางครั้งก็แสดงส่วนขยายที่ไม่ได้มาตรฐานเป็นโซลูชันที่ต้องการ คุณจะพบกับรหัสที่ไม่สามารถแปลได้สูงหากคุณทำตามคำแนะนำนั้น
Fabio Fracassi

4
  • ระวังการจัดการหน่วยความจำ รับแนวคิดที่ชัดเจนเกี่ยวกับวิธีการทำงานของพอยน์เตอร์และการอ้างอิงใน C ++ ตรงกันข้ามกับ C # นอกจากนี้ RAII การจัดการหน่วยความจำด้วยตนเองและพอยน์เตอร์อัจฉริยะในที่สุด
  • เทมเพลตและยาชื่อสามัญมีลักษณะคล้ายกัน แต่มีสัตว์ต่างกัน รู้ถึงการทำงานของแม่แบบ
  • มีความแตกต่างทางวากยสัมพันธ์เล็ก ๆ น้อย ๆ แต่จับใจ เรียนรู้พวกเขา
  • คุณคุ้นเคยกับ STL แทนที่จะเป็น. net BCL คุณอาจจะพลาดบิตที่ดีถ้ามีการติดยาเสพติด LINQ
  • มีความแตกต่างพื้นฐานในการออกแบบระหว่าง C ++ และ C # ดังนั้นคุณจึงไม่สามารถถ่ายทอดความคิดได้ ทุกสิ่งที่คุณสร้างด้วย C ++ คุณต้องออกแบบตั้งแต่เริ่มต้น
  • โชคดี

1

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


1

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


1

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

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

สิ่งที่ดีเกี่ยวกับ C ++ คือการจัดสรรอ็อบเจ็กต์สแต็กค่อนข้างง่ายส่วนใหญ่และคุณควรจัดสรรวัตถุด้วยวิธีนี้หากโปรแกรมของคุณจะตรงตามข้อกำหนดที่ระบุไว้ภายใต้วิธีการนี้ มิฉะนั้นคุณต้องพึ่งพาพอยน์เตอร์สำหรับความเร็วประสิทธิภาพและทำความสะอาดอย่างรวดเร็ว ฉันขอแนะนำให้อ่านสิ่งนี้: http://www.parashift.com/c++-faq-lite/เนื่องจากจะทำให้คุณมีความเข้าใจด้านเทคนิคจำนวนมากว่า C ++ ทำงานอย่างไรภายใต้ประทุน

ผมขอยกตัวอย่าง:

ใน C ++ มีการใช้ Constructor นี้ที่รู้จักกันในชื่อ "initialization list" ซึ่งแตกต่างจากการเริ่มต้นสมาชิกคลาสในเนื้อความของ Constructor ทำไม? เพราะหากประเภทที่เริ่มต้นนั้นเป็นแบบดั้งเดิมคอมไพเลอร์จะสร้างสำเนาจำนวนมากและสำเนาที่ไม่จำเป็นของวัตถุที่สร้างเมื่อจัดสรรในร่างกายของ ctor วิธีนี้อาจลดประสิทธิภาพได้ขึ้นอยู่กับคอมไพเลอร์เช่นเดียวกับข้อกำหนดที่ปรับขนาดของแอป

รู้ว่าตัวแทนคืออะไร? ดีใน C ++ มันเป็นที่รู้จักกันเป็นตัวชี้ฟังก์ชัน ภาษานี้ค่อนข้างยากที่จะเชี่ยวชาญในตอนแรก แต่ถ้าคุณต้องการที่จะยอดเยี่ยม ... มันต้องมีแน่นอน

C # นั้นง่าย ... ง่ายมาก


C # ผู้ได้รับมอบหมายและตัวชี้ฟังก์ชัน c แตกต่างกันมาก ผู้รับมอบสิทธิ์จะอยู่ใกล้กับ functor ใน C ++ มากกว่าตัวชี้ฟังก์ชัน
CodesInChaos

-2

เชื่อฉันเลือกหนังสือที่ดีใน C ++ (มีอีกมากแค่ค้นหา) และเริ่มเรียนรู้ ...


1
BTW เรียนรู้ C ก่อน (พอยน์เตอร์, อาร์เรย์, โครงสร้าง) จะดี
Muhammad Hewedy

7
การเรียนรู้ C ก่อน C ++ จะทำให้คุณกลับเข้าสู่ยุคหิน ทุกวันนี้เราไม่ค่อยใช้อาร์เรย์และตัวชี้ใน C ++ ภาษามีวิวัฒนาการมาจากพวกเขาเมื่อนานมาแล้ว
fredoverflow

7
@ Muhammad: ทุกคนชอบความเร็วความปลอดภัยความสะดวกในการบำรุงรักษา
DeadMG

3
@DPD: โปรแกรมเมอร์ C ++ มืออาชีพหลายคนรวมถึง Bjarne Stroustrup (ผู้ประดิษฐ์ภาษา) ไม่เห็นด้วยกับคุณ หนังสือเล่มล่าสุดของเขาสอนโดยใช้วัตถุและเทมเพลตตั้งแต่ต้นในขณะที่อาร์เรย์และพอยน์เตอร์ไม่ได้พูดถึงเลยก่อนบทที่ 17 (หน้า 500 และบางอย่าง)
fredoverflow

2
@DeadMG บางที แต่คุณไม่สามารถเปลี่ยนวิวัฒนาการ C-> C ++ ได้ หากคุณเกลียดชังส่วน C ของ C ++ ให้ไปที่ Java หรือ C # โดยส่วนตัวแล้วฉันพบว่าการให้ความสำคัญกับพอยน์เตอร์และอาร์เรย์ใน C ก่อนที่จะไปที่ C ++ ช่วยฉันได้มากในอาชีพของฉัน แน่นอนว่าคุณสามารถเขียนรหัสแอปพลิเคชันทั้งหมดโดยไม่มีพวกเขา แต่ถ้าคุณต้องการประโยชน์ของ polymorphism ที่คุณต้องรู้พอยน์เตอร์ รูปแบบที่สำคัญของ GoF สามารถนำไปใช้ได้โดยไม่ต้องพอยน์เตอร์? มันไม่เหมือนกันสำหรับเพื่อนของฉันที่หลีกเลี่ยงส่วน "ยาก" เมื่อเรียน C. พวกเขาส่วนใหญ่พบว่ามันยากที่จะเข้าใจความแตกต่าง
DPD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.