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

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

17
คำถามสัมภาษณ์งาน C ++ ที่ดีที่สุดคืออะไร [ปิด]
ถ้าคุณสามารถถามโปรแกรมเมอร์ C ++ คำถามเดียวเพื่อวัดทักษะ C ++ ของพวกเขามันจะเป็นอะไร? คำถามที่ฉันคิดว่าดีที่สุดคือ: คุณเรียก "ลบสิ่งนี้" ได้ไหม ภายในฟังก์ชั่นสมาชิก? (ฉันใส่สิ่งนี้เป็นลิงก์เพื่อให้คุณสามารถคิดได้ก่อนแล้วไปที่คำถามสัมภาษณ์ C ++ ที่ดีที่สุด - Ever!เพื่อดูคำตอบที่ถูกต้อง) ฉันไม่ได้ถามเรื่องนี้เพราะฉันคาดหวังว่าคนส่วนใหญ่จะรู้คำตอบ หากพวกเขาทำมันจะไม่เป็นประโยชน์กับคำถาม ฉันขอดูว่าพวกเขาสามารถหาวิธีตอบคำถามที่ถูกต้องได้หรือไม่
28 c++  interview 

2
การใช้คลาสนามธรรมและอินเทอร์เฟซที่เป็นนามธรรม
แม้ว่าสิ่งนี้จะไม่ได้บังคับในมาตรฐาน C ++ แต่ดูเหมือนว่าวิธี GCC เช่นใช้คลาสผู้ปกครองรวมถึงนามธรรมที่บริสุทธิ์คือการรวมตัวชี้ไปยังตาราง v สำหรับคลาสนามธรรมนั้นในทุกอินสแตนซ์ของคำถาม . โดยปกติแล้วสิ่งนี้จะขยายขนาดของอินสแตนซ์ของคลาสนี้โดยตัวชี้สำหรับคลาสพาเรนต์ทั้งหมดที่มี แต่ฉันสังเกตเห็นว่าคลาส C และโครงสร้างจำนวนมากมีอินเทอร์เฟซหลักมากมายซึ่งโดยทั่วไปแล้วเป็นคลาสนามธรรมที่บริสุทธิ์ ฉันจะแปลกใจถ้าทุกครั้งที่พูดDecimalถูกป่องด้วย 6 ตัวชี้ไปยังทุกมันเป็นอินเทอร์เฟซต่าง ๆ ดังนั้นถ้า C # ทำอินเตอร์เฟสแตกต่างกันอย่างน้อยในการใช้งานทั่วไป (ฉันเข้าใจว่ามาตรฐานตัวเองอาจไม่ได้กำหนดการนำไปใช้) และการใช้งาน C ++ มีวิธีหลีกเลี่ยงการขยายขนาดวัตถุเมื่อเพิ่มผู้ปกครองเสมือนบริสุทธิ์ให้กับชั้นเรียนหรือไม่?

2
ความแตกต่างระหว่าง function () และ function (void) คืออะไร?
ฉันเคยได้ยินว่ามันเป็นวิธีปฏิบัติที่ดีในการเขียนฟังก์ชั่นที่ไม่ได้รับอะไรเป็นพารามิเตอร์เช่นนี้: int func(void); แต่ฉันได้ยินว่าวิธีที่ถูกต้องในการแสดงออกเช่นนี้: int func(); ความแตกต่างระหว่างการประกาศฟังก์ชั่นทั้งสองนี้ในทั้ง C และ C ++ คืออะไร?

3
อัลกอริทึมการค้นหาสตริงใดที่เร็วที่สุด
ฉันติดอยู่กับที่ซึ่งเป็นอัลกอริธึมการค้นหาสตริงที่เร็วที่สุดได้ยินความคิดเห็นมากมาย แต่ในที่สุดฉันก็ไม่แน่ใจ ฉันเคยได้ยินบางคนพูดว่าอัลกอริทึมที่เร็วที่สุดคือ Boyer-Moore และบางคนบอกว่า Knuth-Morris-Pratt เร็วกว่าจริง ผมได้มองขึ้นสำหรับซับซ้อนทั้งในส่วนของพวกเขา O(n+m)แต่พวกเขาส่วนใหญ่มีลักษณะเดียวกัน ฉันได้พบว่าในกรณีที่เลวร้ายที่สุดกรณี Boyer-Moore มีO(nm)ความซับซ้อนเมื่อเทียบกับ Knuth-Morris-Pratt ซึ่งมี O (m + 2 * n) โดยที่ n = ความยาวของข้อความและ m = ความยาวของรูปแบบ เท่าที่ฉันรู้บอยเยอร์ - มัวร์มีเวลาตรงเชิงเส้นที่เลวร้ายที่สุดถ้าฉันจะใช้กฎกาลิล คำถามของฉันสิ่งที่จริงแล้วคืออัลกอริธึมการค้นหาสตริงที่เร็วที่สุด (คำถามนี้รวมถึงอัลกอริธึมต่อยที่เป็นไปได้ทั้งหมดไม่ใช่แค่ Boyer-Moore และ Knuth-Morris-Pratt) แก้ไข:เนื่องจากคำตอบนี้ สิ่งที่ฉันกำลังมองหาคือ: ได้รับข้อความTและรูปแบบที่Pผมต้องไปหาที่ปรากฏทั้งหมดของในPT นอกจากนี้ความยาวของ P และ T มาจาก[1,2 000 000]และโปรแกรมต้องทำงานต่ำกว่า 0.15 วินาที ฉันรู้ว่า KMP และ …

7
ฉันจะเรียนรู้การเขียนสำนวน C ++ ได้อย่างไร
ฉันเป็นนักเรียนวิทยาศาสตร์คอมพิวเตอร์และด้วยเหตุนี้ฉันจึงได้สอน C ++ ในฐานะรุ่น C ที่ดีกว่าด้วยชั้นเรียน ท้ายที่สุดฉันพยายามที่จะบูรณาการวงล้อเมื่อใดก็ตามที่จำเป็นต้องแก้ปัญหาที่ซับซ้อนเพียงเพื่อหาบางครั้งหลังจากนั้นคุณสมบัติภาษาบางอย่างหรือรูทีนไลบรารีมาตรฐานบางอย่างอาจทำเช่นนั้นได้สำหรับฉัน ฉันทั้งหมดสะดวกสบายกับฉันchar*และ*(int*)(someVoidPointer)สำนวน แต่เมื่อเร็ว ๆ นี้หลังจากการ (เล็กน้อย) มีส่วนร่วมในโครงการที่เปิดแหล่งที่มาผมรู้สึกว่าไม่ได้เป็นวิธีการหนึ่งที่ควรจะคิดว่าเมื่อเขียนรหัส c ++ มันแตกต่างจาก C มาก เมื่อพิจารณาว่าฉันรู้ว่าการเขียนโปรแกรมเชิงวัตถุค่อนข้างดีและฉันก็โอเคกับเส้นโค้งการเรียนรู้ที่สูงชันคุณจะแนะนำอะไรให้ฉันทำให้ฉันนึกถึงแทร็ก C ++ เมื่อฉันเขียนโค้ด C ++?
27 c++ 

8
การคิดค่าเสื่อมราคาถือว่าเป็นอันตรายหรือไม่? [ปิด]
ฉันเพิ่งรวบรวมรหัสของตัวเองบางอย่างกับ-std=c++0xธงใน GCC เนื่องจากฉันต้องการติดตามสิ่งที่คนหนุ่มสาวกำลังทำอยู่อย่างคลุมเครือ เกี่ยวกับauto_ptrการคัดค้าน แน่นอนฉันรู้ว่าauto_ptrเลิกใช้แล้วใน C ++ 0x แต่ ... การเลิกใช้งานเป็นการเสียเวลาและความพยายามใช่ไหม สาเหตุของการไม่คิดค่าเสื่อมราคา (ด้วย auto_ptr เป็นตัวอย่าง): มีมหาสมุทรที่เต็มไปด้วยรหัสซึ่งยังต้องได้รับการสนับสนุนการสร้างคำเตือนนับล้านจะดึงดูดผู้คนให้ปิดคำเตือนเท่านั้น auto_ptr มันเป็นเรื่องเล็กน้อย แต่จริงๆแล้วมันทำในสิ่งที่มันพูดบนกระป๋อง printf()ถ้าเราอยากจะเลิกใช้สิ่งที่ผมเสนอชื่อ แต่ลองจินตนาการถึงเสียงซัดทอดที่จะตามมา auto_ptrไม่มีเพื่อนมากเกินไป แต่อย่างน้อยในรหัส C ++ ของฉันมันถูกใช้มากกว่าprintfซึ่งไม่ได้ใช้เลย คณะกรรมการมีประวัติไม่ดีในการได้รับสิทธินี้ - พวกเขาคัดค้านสแตติกที่ขอบเขตเนมสเปซและตอนนี้ดูเหมือนว่าจะไม่ได้รับการแก้ไข - ฉันจะไม่แปลกใจถ้าauto_ptrทำแบบเดียวกันกลับมา สุดท้ายสิ่งที่คณะกรรมการกล่าวว่าผู้ดำเนินการคอมไพเลอร์ไม่สนใจพวกเขา - พวกเขาไม่สามารถเสี่ยงต่อการทำลายรหัสลูกค้าของพวกเขาสิ่งที่พวกเขาสามารถทำได้ก็คือการออกคำเตือนที่น่ารำคาญ ดังนั้นคำถามของฉัน - คุณพิจารณาการคัดค้าน (ของอะไรไม่ใช่แค่ auto_ptrs และไม่ใช่แค่ใน C ++) เป็นความคิดที่ดีและถ้าเป็นเช่นนั้นทำไม

5
เทมเพลต C ++ เป็นเพียงแมโครชนิดหนึ่งที่ได้รับการยกย่องหรือไม่?
จากการเปรียบเทียบที่แตกต่างกันระหว่างเทมเพลต C ++ และเจเนอรัล C # / Java เช่นนี้ - /programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 ฉันเข้าใจว่ามีการใช้เทมเพลต C ++ โดยการประมวลผลล่วงหน้าบางอย่าง (การแทนที่ข้อความธรรมดาก่อนการแยกวิเคราะห์) ไม่ได้รวบรวม เนื่องจากการตรวจสอบชนิดในเทมเพลต C ++ มีลักษณะคล้ายกับมาโคร C ฉันหมายความว่าหากมีข้อผิดพลาดบางอย่างพวกเขาเป็นข้อผิดพลาดจากรหัสที่สร้างขึ้นหลังจากการประมวลผลบล็อกรหัส templated ไม่ใช่จากแม่แบบเอง กล่าวอีกนัยหนึ่งมันเป็นแค่มาโครระดับสูงในซี จากนั้นฉันก็พบข้อเท็จจริงอื่น ๆ ที่สนับสนุนสิ่งนี้ - ฉันคิดว่าถ้ามีการใช้เทมเพลต C ++ โดยการประมวลผลล่วงหน้าจะมีปัญหากับการเชื่อมโยงแบบไดนามิก (โดยใช้. dll) และ googling ที่รวดเร็วสนับสนุนสิ่งนี้ อีกจุดคือค่าคงที่จำนวนเต็มสามารถส่งผ่านเป็นอาร์กิวเมนต์ไปยังเทมเพลต และมันยังรองรับการเรียกซ้ำบางประเภท แต่การเรียกซ้ำนี้ไม่พบในรหัสแอสเซมบลีที่รวบรวม / เครื่อง สิ่งที่เรียกซ้ำได้รับการจัดการในเวลารวบรวมโดยการสร้างฟังก์ชั่นสำหรับทุกการโทรซ้ำและจึงมีไบนารีที่ปฏิบัติการขนาดใหญ่ แต่เร็วกว่า แม้ว่าจะแตกต่างจากแมโคร C แต่มีความสามารถที่เหนือกว่า แต่เท็มเพลต …
27 c++  c  compiler  templates  macros 

9
เหตุใดจึงควรปิดการใช้งานคำเตือนคอมไพเลอร์?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา คำตอบนี้และความคิดเห็นที่เพิ่มเข้าไปแสดงวิธีปิดการใช้งานคำเตือนคอมไพเลอร์หลายคำ#pragmaสั่งโดยใช้คำสั่ง ทำไมหนึ่งต้องการทำเช่นนั้น? โดยปกติแล้วคำเตือนจะอยู่ที่เหตุผลและฉันก็รู้สึกเสมอว่าเป็นเหตุผลที่ดี มี "กรณีที่ถูกต้อง" ที่คำเตือนควรปิดการใช้งานหรือไม่ ตอนนี้ฉันนึกอะไรไม่ออกเลย แต่นั่นอาจเป็นแค่ฉัน
26 c#  c++  c  warnings 

13
การติวหนังสือนักเรียนที่กำลังดิ้นรนกับพื้นฐานใน C ++ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว ฉันกำลังสอนนักเรียนสองสามคนที่มีปัญหาในการเรียนรู้พื้นฐานของภาษาโปรแกรมแรก: C ++ ฉันรู้จักนักเรียนที่ยอดเยี่ยมและสดใสหลายคนที่ล้มเหลวหรือลงเรียนหลักสูตร CS ครั้งแรก ทุกคนที่ฉันสอนจะให้ประสบการณ์คล้าย ๆ กันในชั้นเรียน: ผู้สอนเดินไปเร็วเกินไปไม่มีสิ่งใดในการบรรยายที่สมเหตุสมผล ก่อนหน้าชั้นเรียน CS นี้นักเรียนที่ดิ้นรนเหล่านี้ส่วนใหญ่ไม่แสดงความสนใจในคอมพิวเตอร์ใด ๆ เลยนอกจากโปรแกรมประมวลผลคำเว็บเบราว์เซอร์หรือรูปแบบความบันเทิงอื่น ๆ คอมพิวเตอร์เป็นกล่องดำที่ใช้งานได้ทำไมต้องยุ่งกับมัน การคาดเดาที่ดีที่สุดของฉันคือพวกเขากำลังมีปัญหาในการเชื่อมต่อบทคัดย่อของวิทยาการคอมพิวเตอร์กับแนวคิดที่คุ้นเคย กล่าวคือนักเรียนเหล่านี้อาจรู้วิธีการเรียนรู้คณิตศาสตร์ชีววิทยาหรือฟิสิกส์ แต่เทคนิคเหล่านั้นไม่ทำงานเมื่อมาเขียนโปรแกรม ไม่มีใครมีข้อเสนอแนะหรือคำแนะนำ? นักเรียนที่ฉันกำลังช่วยไม่สมควรที่จะล้มเหลวในชั้นเรียนนี้ เป็นที่ชัดเจนว่าผู้สอนไม่ได้คำนึงถึงรูปแบบการเรียนรู้ของนักเรียนเหล่านี้ กล่าวคืออาจารย์ผู้สอนไม่ได้เป็นนักเรียนของเขา

25
C ++ เหมาะสมกับภาษาแรกหรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ วิทยาลัยท้องถิ่นกำลังสอนภาษาซีพลัสพลัสให้กับนักศึกษาชั้นปีที่ 1 (อายุ 16 ปี) ที่ไม่มีประสบการณ์การเขียนโปรแกรมมาก่อน ในฐานะภาษาโปรแกรมแรก C ++ นั้นเหมาะสมหรือไม่

2
มันจะไม่ดีที่จะทำเครื่องหมาย constexpr ฟังก์ชั่น C ++?
รับฟังก์ชั่นที่น่ารำคาญมาก int transform(int val) { return (val + 7) / 8; } มันควรจะชัดเจนว่ามันง่ายที่จะเปลี่ยนฟังก์ชั่นนี้เป็นconstexprฟังก์ชั่นทำให้ฉันใช้มันเมื่อกำหนดconstexprตัวแปรเช่น: constexpr int transform(int val) { return (val + 7) / 8; } ข้อสันนิษฐานของฉันคือสิ่งนี้เป็นการปรับปรุงอย่างเข้มงวดเนื่องจากฟังก์ชันยังสามารถเรียกใช้ในconstexprบริบทที่ไม่ได้และตอนนี้สามารถใช้เพื่อช่วยกำหนดตัวแปรค่าคงที่เวลาคอมไพล์ได้ คำถามของฉันคือมีสถานการณ์ที่นี่เป็นความคิดที่ไม่ดีหรือไม่? เช่นโดยการใช้ฟังก์ชั่นนี้constexprฉันจะเคยพบกับสถานการณ์ที่ฟังก์ชั่นนี้จะไม่สามารถใช้งานได้ในบางสถานการณ์หรือมันจะทำงานผิดปกติหรือไม่?
26 c++  c++11 

11
เต็มไปด้วยข้อบกพร่องแบบมัลติเธรด
ในทีมใหม่ของฉันที่ฉันจัดการรหัสส่วนใหญ่ของเราคือแพลตฟอร์มซ็อกเก็ต TCP และรหัสเครือข่าย http C ++ ทั้งหมด ส่วนใหญ่มาจากผู้พัฒนารายอื่นที่ออกจากทีมไป นักพัฒนาปัจจุบันของทีมนั้นฉลาดมาก แต่ส่วนใหญ่เป็นรุ่นรองในแง่ของประสบการณ์ ปัญหาที่ใหญ่ที่สุดของเรา: ข้อบกพร่องที่เกิดขึ้นพร้อมกันแบบมัลติเธรด ไลบรารีคลาสของเราส่วนใหญ่เขียนเป็นแบบอะซิงโครนัสโดยใช้คลาสเธรดพูลบางคลาส เมธอดบนไลบรารีคลาสมักเข้าคิวเพื่อรัน taks ที่ยาวบนเธรดพูลจากเธรดหนึ่งและจากนั้นเมธอดการเรียกกลับของคลาสนั้นจะถูกเรียกใช้บนเธรดอื่น เป็นผลให้เรามีข้อบกพร่องกรณีขอบจำนวนมากที่เกี่ยวข้องกับข้อสันนิษฐานเกลียวที่ไม่ถูกต้อง ซึ่งส่งผลให้ข้อบกพร่องที่ลึกซึ้งที่มีมากกว่าส่วนที่สำคัญและล็อคเพื่อป้องกันปัญหาการเกิดพร้อมกัน สิ่งที่ทำให้ปัญหาเหล่านี้ยากขึ้นคือความพยายามแก้ไขมักไม่ถูกต้อง ข้อผิดพลาดบางประการที่ฉันสังเกตเห็นว่าทีมพยายาม (หรือภายในรหัสเดิม) รวมถึงสิ่งต่อไปนี้: ข้อผิดพลาดทั่วไป # 1 - แก้ไขปัญหาการเกิดพร้อมกันโดยเพียงแค่ใส่ล็อกรอบ ๆ ข้อมูลที่ใช้ร่วมกัน แต่ลืมเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อวิธีการไม่ได้รับการเรียกในลำดับที่คาดหวัง นี่เป็นตัวอย่างง่ายๆ: void Foo::OnHttpRequestComplete(statuscode status) { m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } ดังนั้นตอนนี้เรามีข้อผิดพลาดที่สามารถเรียกปิดได้ในขณะที่ OnHttpNetworkRequestComplete กำลังเกิดขึ้น ผู้ทดสอบพบข้อผิดพลาดจับการถ่ายโอนข้อมูลความผิดพลาดและกำหนดข้อผิดพลาดให้กับนักพัฒนา เขาก็แก้ไขข้อผิดพลาดเช่นนี้ …

4
เหตุใด C ++ และ Java ทั้งสองจึงใช้แนวคิดของ“ การอ้างอิง” แต่ไม่เข้าใจ
ใน C ++ อาร์กิวเมนต์การอ้างอิงไปยังฟังก์ชันอนุญาตให้ฟังก์ชันทำการอ้างอิงถึงสิ่งอื่น: int replacement = 23; void changeNumberReference(int& reference) { reference = replacement; } int main() { int i = 1; std::cout << "i=" << i << "\n"; // i = 1; changeNumberReference(i); std::cout << "i=" << i << "\n"; // i = 23; } อะนาล็อกอาร์กิวเมนต์อ้างอิงคงที่ไปยังฟังก์ชันจะแสดงข้อผิดพลาดเวลารวบรวมถ้าเราพยายามเปลี่ยนการอ้างอิง: void changeNumberReference(const …
26 java  c++  pointers  reference 

4
วิธีหลีกเลี่ยง“ ผู้จัดการ” ในรหัสของฉัน
คำถามนี้ถูกโยกย้ายจาก Code Exchange Stack Stack เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 6 ปีที่แล้ว ขณะนี้ฉันกำลังออกแบบระบบ Entityของฉันใหม่สำหรับ C ++ และฉันมีผู้จัดการจำนวนมาก ในการออกแบบของฉันฉันมีชั้นเรียนเหล่านี้เพื่อผูกห้องสมุดของฉันเข้าด้วยกัน ฉันได้ยินสิ่งเลวร้ายมากมายเมื่อพูดถึงคลาส "ผู้จัดการ" บางทีฉันอาจไม่ได้ตั้งชื่อชั้นเรียนของฉันอย่างเหมาะสม อย่างไรก็ตามฉันไม่รู้ว่าจะตั้งชื่อพวกเขาอย่างไร ผู้จัดการส่วนใหญ่ในห้องสมุดของฉันประกอบด้วยชั้นเรียนเหล่านี้ (แม้ว่ามันจะแตกต่างกันเล็กน้อย): คอนเทนเนอร์ - คอนเทนเนอร์สำหรับวัตถุในตัวจัดการ คุณสมบัติ - คุณลักษณะสำหรับวัตถุในผู้จัดการ ในการออกแบบใหม่สำหรับห้องสมุดของฉันฉันมีชั้นเรียนเฉพาะเหล่านี้เพื่อผูกห้องสมุดของฉันเข้าด้วยกัน ComponentManager - จัดการส่วนประกอบใน Entity System ComponentContainer ComponentAttributes ฉาก * - อ้างอิงถึงฉาก (ดูด้านล่าง) SystemManager - จัดการระบบในระบบองค์กร SystemContainer ฉาก * …

3
มีความแตกต่างอะไรระหว่างการใช้ struct และ std :: pair
ฉันเป็นโปรแกรมเมอร์ C ++ ที่มีประสบการณ์ จำกัด สมมติว่าฉันต้องการใช้STL mapเพื่อจัดเก็บและจัดการกับข้อมูลบางอย่างฉันต้องการทราบว่ามีความแตกต่างที่มีความหมาย (ในประสิทธิภาพ) ระหว่างโครงสร้างข้อมูล 2 วิธี: Choice 1: map<int, pair<string, bool> > Choice 2: struct Ente { string name; bool flag; } map<int, Ente> โดยเฉพาะมีค่าใช้จ่ายใด ๆ ที่ใช้structแทนง่ายpairหรือไม่

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