คำถามติดแท็ก c++

คำถามเกี่ยวกับ C ++ ซึ่งเป็นภาษาการเขียนแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป

6
ฟังก์ชั่นโดยไม่ได้ตั้งใจทำให้พารามิเตอร์อ้างอิง - สิ่งที่ผิดพลาด?
วันนี้เราพบสาเหตุของข้อผิดพลาดที่น่ารังเกียจที่เกิดขึ้นเป็นระยะ ๆ ในบางแพลตฟอร์มเท่านั้น ต้มโค้ดของเราออกมาเป็นแบบนี้: class Foo { map<string,string> m; void A(const string& key) { m.erase(key); cout << "Erased: " << key; // oops } void B() { while (!m.empty()) { auto toDelete = m.begin(); A(toDelete->first); } } } ปัญหาอาจดูเหมือนชัดเจนในกรณีที่ง่ายนี้: Bผ่านการอ้างอิงถึงคีย์Aซึ่งจะลบรายการแผนที่ก่อนที่จะพยายามพิมพ์ (ในกรณีของเรามันก็ไม่ได้พิมพ์ แต่ใช้ในทางที่ซับซ้อนมากขึ้น) นี้เป็นหลักสูตรที่ไม่ได้กำหนดพฤติกรรมเนื่องจากมีการอ้างอิงห้อยหลังจากการเรียกร้องให้keyerase แก้ไขครั้งนี้เป็นที่น่ารำคาญ - เราเพิ่งเปลี่ยนประเภทพารามิเตอร์จากไปconst string& stringคำถามคือเราจะหลีกเลี่ยงข้อผิดพลาดนี้ได้ตั้งแต่แรกอย่างไร? ดูเหมือนว่าทั้งสองฟังก์ชั่นทำในสิ่งที่ถูกต้อง: Aไม่มีทางรู้ว่าkeyหมายถึงสิ่งที่มันกำลังจะทำลาย …
54 c++ 

10
ทำไมคำหลัก 'สุดท้าย' จึงมีประโยชน์
ดูเหมือนว่า Java มีอำนาจในการประกาศคลาสที่ไม่สามารถสืบทอดได้สำหรับทุกวัยและตอนนี้ C ++ ก็มีเช่นกัน อย่างไรก็ตามในแง่ของหลักการ Open / Close ใน SOLID ทำไมมันถึงมีประโยชน์? สำหรับฉันfinalคำหลักฟังดูเหมือนfriend- ถูกกฎหมาย แต่ถ้าคุณใช้งานอยู่การออกแบบส่วนใหญ่อาจผิด โปรดให้ตัวอย่างที่คลาสที่ไม่สามารถสืบทอดได้จะเป็นส่วนหนึ่งของสถาปัตยกรรมที่ดีหรือรูปแบบการออกแบบ
54 java  c++  solid  final 

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

5
ทำไมตัวชี้สมาร์ทที่มีการอ้างอิงจำนวนมากถึงได้รับความนิยม?
อย่างที่ฉันเห็นตัวชี้สมาร์ทถูกใช้อย่างกว้างขวางในโครงการ C ++ ในโลกแห่งความเป็นจริง แม้ว่าพอยน์เตอร์อัจฉริยะบางประเภทจะมีประโยชน์ในการสนับสนุน RAII และการถ่ายโอนความเป็นเจ้าของ แต่ก็มีแนวโน้มที่จะใช้พอยน์เตอร์ที่ใช้ร่วมกันตามค่าเริ่มต้นเป็นวิธีการ"เก็บขยะ"เพื่อให้โปรแกรมเมอร์ไม่ต้องคิดถึงการจัดสรรมาก . ทำไมตัวชี้ที่ใช้ร่วมกันรับความนิยมมากกว่าการบูรณาการเก็บขยะที่เหมาะสมเช่นBoehm GC ? (หรือคุณเห็นด้วยเลยว่ามันได้รับความนิยมมากกว่า GCs จริงหรือไม่) ฉันรู้เกี่ยวกับข้อดีสองประการของ GCs ทั่วไปมากกว่าการนับการอ้างอิง: ขั้นตอนวิธี GC ธรรมดาไม่มีปัญหากับการอ้างอิงรอบ การนับการอ้างอิงโดยทั่วไปจะช้ากว่า GC ที่เหมาะสม อะไรคือสาเหตุของการใช้ตัวชี้สมาร์ทนับการอ้างอิง?

11
เหตุใด C ++ จึงมี 'พฤติกรรมที่ไม่ได้กำหนด' (UB) และภาษาอื่น ๆ เช่น C # หรือ Java ไม่
โพสต์สแต็คโอเวอร์โฟลว์นี้แสดงรายการสถานการณ์ที่ค่อนข้างครอบคลุมซึ่งข้อกำหนดภาษา C / C ++ ประกาศว่าเป็น 'พฤติกรรมที่ไม่ได้กำหนด' อย่างไรก็ตามฉันต้องการเข้าใจว่าทำไมภาษาสมัยใหม่อื่น ๆ เช่น C # หรือ Java ไม่มีแนวคิดของ 'พฤติกรรมที่ไม่ได้กำหนด' มันหมายความว่าผู้ออกแบบคอมไพเลอร์สามารถควบคุมสถานการณ์ที่เป็นไปได้ทั้งหมด (C # และ Java) หรือไม่ (C และ C ++)?

3
ทำไมข้อกำหนดข้อยกเว้นไม่ดี?
ย้อนกลับไปที่โรงเรียนเมื่อ 10 ปีก่อนพวกเขาสอนให้คุณใช้เครื่องมือระบุข้อยกเว้น เนื่องจากพื้นหลังของฉันเป็นหนึ่งในนั้นโปรแกรมเมอร์ Torvaldish C ที่หลีกเลี่ยงการดื้อ C ++ ยกเว้นว่าถูกบังคับให้ฉันลงเอยด้วยการใช้ C ++ เป็นระยะ ๆ และเมื่อฉันยังคงใช้ตัวระบุข้อยกเว้นเนื่องจากนั่นคือสิ่งที่ฉันได้รับการสอน อย่างไรก็ตามโปรแกรมเมอร์ C ++ ส่วนใหญ่ดูเหมือนจะขมวดคิ้วเมื่อตัวระบุข้อยกเว้น ฉันได้อ่านการอภิปรายและข้อโต้แย้งต่าง ๆ จาก C ++ ผู้เชี่ยวชาญด้านการเช่นนี้ เท่าที่ฉันเข้าใจมันเดือดลงถึงสามสิ่ง: ตัวระบุข้อยกเว้นใช้ระบบชนิดที่ไม่สอดคล้องกับภาษาที่เหลือ ("ระบบชนิดเงา") หากฟังก์ชั่นของคุณที่มีตัวระบุข้อยกเว้นมีข้อผิดพลาดอื่นใดนอกจากสิ่งที่คุณได้ระบุไว้โปรแกรมจะถูกยกเลิกในรูปแบบที่ไม่ดีและไม่คาดคิด ตัวระบุข้อยกเว้นจะถูกลบออกในมาตรฐาน C ++ ที่กำลังจะมาถึง ฉันพลาดอะไรบางอย่างที่นี่หรือนี่คือเหตุผลทั้งหมดเหรอ? ความคิดเห็นของฉัน: เกี่ยวกับ 1): แล้วอะไรล่ะ C ++ อาจเป็นภาษาการเขียนโปรแกรมที่ไม่สอดคล้องกันมากที่สุดที่เคยมีมา เรามีมาโคร, goto / label, horde (hoard?) ของพฤติกรรมที่ไม่ได้กำหนด - / …

3
C ++ พิมพ์ typedef อย่างยิ่ง
ฉันพยายามคิดวิธีประกาศ typedefs พิมพ์อย่างยิ่งเพื่อจับระดับหนึ่งของข้อบกพร่องในขั้นตอนการรวบรวม มันมักจะเป็นกรณีที่ฉันจะพิมพ์ int ลงในรหัสหลายประเภทหรือเวกเตอร์ไปยังตำแหน่งหรือความเร็ว: typedef int EntityID; typedef int ModelID; typedef Vector3 Position; typedef Vector3 Velocity; สิ่งนี้สามารถทำให้เจตนาของรหัสชัดเจนยิ่งขึ้น แต่หลังจากการเขียนโค้ดคืนหนึ่งอาจทำให้เกิดข้อผิดพลาดที่โง่เขลาเช่นการเปรียบเทียบรหัสต่าง ๆ หรือเพิ่มตำแหน่งให้กับความเร็ว EntityID eID; ModelID mID; if ( eID == mID ) // <- Compiler sees nothing wrong { /*bug*/ } Position p; Velocity v; Position newP = p + …
49 c++  c++11  type-safety 

5
เหตุใดฟังก์ชัน <algorithm> ทั้งหมดจึงมีเพียงช่วงเท่านั้นไม่ใช่คอนเทนเนอร์?
มีฟังก์ชั่นที่มีประโยชน์มากมาย&lt;algorithm&gt;แต่ทุกฟังก์ชั่นทำงานใน"ลำดับ" - คู่ของตัววนซ้ำ เช่นถ้าฉันมีที่เก็บและต้องการที่จะใช้std::accumulateมันฉันต้องเขียน: std::vector&lt;int&gt; myContainer = ...; int sum = std::accumulate(myContainer.begin(), myContainer.end(), 0); เมื่อทั้งหมดที่ฉันตั้งใจจะทำคือ: int sum = std::accumulate(myContainer, 0); ในสายตาของฉันซึ่งอ่านได้ชัดเจนขึ้น ตอนนี้ฉันเห็นแล้วว่าอาจมีบางกรณีที่คุณต้องการใช้งานเฉพาะในส่วนของคอนเทนเนอร์ดังนั้นจึงมีประโยชน์อย่างมากที่จะมีตัวเลือกในการผ่านช่วง แต่อย่างน้อยในประสบการณ์ของฉันนั่นเป็นกรณีพิเศษที่หายาก ฉันมักจะต้องการที่จะทำงานบนภาชนะทั้งหมด มันง่ายที่จะเขียนฟังก์ชั่น wrapper ซึ่งใช้คอนเทนเนอร์และการโทรbegin()และend()บนมัน แต่ฟังก์ชั่นความสะดวกสบายนั้นไม่รวมอยู่ในไลบรารี่มาตรฐาน ฉันต้องการทราบเหตุผลที่อยู่เบื้องหลังตัวเลือกการออกแบบ STL นี้

9
คำอธิบายเกี่ยวกับวิธี“ บอกอย่าถาม” ถือว่าเป็น OO ที่ดี
บล็อกโพสต์นี้ถูกโพสต์ใน Hacker News พร้อมอัปโหลดหลายรายการ มาจาก C ++ ตัวอย่างเหล่านี้ส่วนใหญ่ดูเหมือนจะขัดแย้งกับสิ่งที่ฉันได้รับการสอน เช่นตัวอย่าง # 2: แย่: def check_for_overheating(system_monitor) if system_monitor.temperature &gt; 100 system_monitor.sound_alarms end end เมื่อเทียบกับดี: system_monitor.check_for_overheating class SystemMonitor def check_for_overheating if temperature &gt; 100 sound_alarms end end end คำแนะนำใน C ++ คือคุณควรชอบฟังก์ชั่นฟรีแทนฟังก์ชั่นสมาชิกที่เพิ่มการห่อหุ้ม ทั้งสองอย่างนี้มีความหมายเหมือนกันดังนั้นเหตุใดจึงเลือกตัวเลือกที่มีการเข้าถึงสถานะเพิ่มเติม ตัวอย่างที่ 4: แย่: def street_name(user) if user.address user.address.street_name else 'No …

9
การเปรียบเทียบ IDEs สำหรับการพัฒนา C ++ และ C บน Linux: KDevelop, Eclipse, NetBeans, CodeBlocks และ Anjuta [ปิด]
ฉันต้องการบันทึกประสบการณ์การใช้งาน IDE แบบเต็มรูปแบบบน Linux โดยส่วนตัวแล้วฉันมักทำงานด้วยvimกัน แต่โปรแกรมเมอร์คนอื่น ๆ ต้องการเห็น IDE จริง ๆ ดังนั้นฉันต้องการฟังความเห็นส่วนตัวของคุณเกี่ยวกับ IDE ที่แตกต่างกันและการเปรียบเทียบระหว่างพวกเขาในบริบทต่อไปนี้: C ++ และบางทีการพัฒนา C (ไม่ใช่ Java, Python และอื่น ๆ ) การเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ (ไม่จำเป็นสำหรับการพัฒนา GUI) ทำงานบน Linux ไม่ใช่การพัฒนา "ข้ามแพลตฟอร์ม" ความเห็นจำเป็นต้องคำนึงถึง: มันเสถียรแค่ไหน? ถ้า IDE ขัดข้องฉันไม่ต้องการมัน สะดวกสบายในการใช้ มีประสิทธิภาพสำหรับการแก้ไขข้อบกพร่อง บูรณาการกับระบบการสร้างต่างๆ ความสามารถปรับขยายได้สำหรับโครงการขนาดใหญ่ (โครงการที่มีโค้ดหลายแสนบรรทัด) ฉันเคยทำงานกับ KDevelop และเป็น IDE ที่ดีมากและดูเหมือนว่า KDevelop 4 เป็นความก้าวหน้าที่ยิ่งใหญ่ ดูเหมือนว่าหลายคนใช้ …
49 c++  ide  linux 

2
ไลบรารีส่วนหัวเท่านั้นมีประสิทธิภาพมากกว่าหรือไม่
สมมติฐาน ข้อดีอย่างหนึ่งของไลบรารีส่วนหัวเท่านั้นสำหรับ C ++ คือไม่จำเป็นต้องรวบรวมแยกต่างหาก ใน C และ C ++ inlineเหมาะสมเมื่อฟังก์ชันถูกกำหนดในไฟล์ส่วนหัว * ตามเนื้อผ้ามีการใช้รูปแบบ C, .c / .h โดยที่ส่วนหัวแสดงส่วนติดต่อสาธารณะที่น้อยที่สุดของหน่วยการแปล ในทำนองเดียวกัน. cpp / hpp คำถาม ไลบรารีส่วนหัวเท่านั้นโดยทั่วไปมีประสิทธิภาพมากขึ้น - เวลาในการประมวลผลและฉลาดกว่าเลย์เอาต์ดั้งเดิมหรือไม่? ถ้าเป็นเช่นนี้เป็นเพราะการอินไลน์อย่างกว้างขวางหรือการเพิ่มประสิทธิภาพอื่น ๆ ? * - การกำหนดฟังก์ชั่นในส่วนหัวช่วยให้คอมไพเลอร์สามารถเห็นการใช้งานในระหว่างการรวบรวมหน่วยการแปลใด ๆ และทำให้สามารถสร้างโค้ดอินไลน์ได้
48 c++  c  libraries 

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

4
คอมไพเลอร์ C ++ ตัวแรกสามารถเขียนเป็น C ++ ได้อย่างไร?
Stroustrup อ้างว่า Cfront ซึ่งเป็นคอมไพเลอร์ C ++ ตัวแรกเขียนด้วย C ++ ( คำถามที่พบบ่อยของ Stroustrup ) อย่างไรก็ตามเป็นไปได้อย่างไรที่คอมไพเลอร์ C ++ แรกจะถูกเขียนใน C ++ โค้ดที่ประกอบเป็นคอมไพเลอร์จำเป็นต้องถูกคอมไพล์ด้วยและทำให้คอมไพเลอร์ C ++ ตัวแรกไม่สามารถเขียนใน C ++ ได้ใช่ไหม

11
ฉันควรทำอย่างไรเมื่อผู้สัมภาษณ์ไม่ทราบคำตอบสำหรับคำถามของตนเอง [ปิด]
เมื่อวานนี้ฉันมีประสบการณ์ที่แย่มากในการสัมภาษณ์ ผู้สัมภาษณ์ถามฉันเกี่ยวกับฟังก์ชั่นเสมือนจริง ฉันพูดว่ามันอาจจะมีหรือไม่มีความหมายในคลาสฐาน แต่คลาสที่ได้รับควรให้คำจำกัดความนอกจากว่าพวกเขาต้องการที่จะเป็นคลาสนามธรรม แต่ผู้สัมภาษณ์ถามต่อไปว่า "Can pure virtual มีคำจำกัดความ !!! ???" ... ฉันตอบว่าใช่ เขาพูดอีกครั้งว่า "เพียว" ฉันพูดว่าใช่. อนุญาตคลาสที่ได้รับสามารถเรียกใช้ฟังก์ชันนั้นได้อย่างชัดเจนหากพวกเขาต้องการพฤติกรรมที่เฉพาะเจาะจง เขาส่งฉันออกไป ฉันแน่ใจว่าเขาไม่ทราบความจริงที่ว่าฟังก์ชั่นเสมือนที่บริสุทธิ์สามารถมีความหมายได้ วิธีจัดการกับผู้สัมภาษณ์ประเภทนี้ หลังจากถามครั้งที่ 2 ฉันควรโกหกไหมว่ามันไม่มีความหมาย? :) หรือฉันควรยึดติดกับคำพูดของฉันและปล่อยโอกาสในการทำงาน
48 c++  interview 

3
การพัฒนา Android โดยใช้ C และ C ++ [ปิด]
ฉันเป็นนักพัฒนา C, C ++ ฉันสนใจในการพัฒนาอุปกรณ์พกพา ฉันอยากรู้ว่าฉันจะพัฒนาแอพ Android โดยใช้ C และ C ++ ได้อย่างไรฉันได้อ่านมาแล้วว่าพวกเขากำลังจัดหาชุดเครื่องมือสำหรับนักพัฒนา C, C ++ แต่มันไม่มีฟังก์ชั่นทั้งหมดเหมือนชุด Java ฉันควรจะไปหาชุดพัฒนา C / C ++ หรือดีกว่าที่จะเรียนรู้จาวาเพราะพวกเขาอาจไม่ได้มีฟังก์ชั่นทั้งหมดในอนาคต?
47 c++  c  android 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.