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

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

10
ทำไมภาษาต้องใช้วงเล็บในการแสดงออกเมื่อใช้กับ“ ถ้า” และ“ ในขณะที่”
ภาษาเช่น C, Java และ C ++ ทั้งหมดต้องวงเล็บรอบการแสดงออกทั้งเมื่อนำมาใช้ในการให้if, หรือwhileswitch if (true) { // Do something } ตรงข้ามกับ if true { // Do something } นี่ดูแปลกสำหรับฉันเพราะวงเล็บซ้ำซ้อน ในตัวอย่างtrueนี้เป็นการแสดงออกเพียงอย่างเดียวของมันเอง วงเล็บไม่เปลี่ยนความหมายในทางใดทางหนึ่งที่ฉันรู้ ทำไมไวยากรณ์แปลก ๆ นี้จึงมีอยู่และทำไมมันจึงเป็นเรื่องธรรมดา? มีประโยชน์ไหมที่ฉันไม่ทราบ?

13
มันสมเหตุสมผลที่จะป้องกัน null ทุกตัวชี้ dereferenced หรือไม่
ในงานใหม่ฉันได้รับการตั้งค่าสถานะในการตรวจสอบรหัสสำหรับรหัสเช่นนี้: PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_->sendMsg("shutdown()"); } ฉันบอกว่าวิธีสุดท้ายควรอ่าน: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_->sendMsg("shutdown()"); } } นั่นคือฉันจะต้องใส่NULLยามรอบmsgSender_ตัวแปรแม้ว่ามันจะเป็นข้อมูลส่วนตัว มันยากสำหรับฉันที่จะควบคุมตัวเองจากการใช้คำไม่สุภาพเพื่ออธิบายว่าฉันรู้สึกอย่างไรกับ 'ปัญญา' ชิ้นนี้ เมื่อฉันขอคำอธิบายฉันได้รับเรื่องราวสยองขวัญเกี่ยวกับวิธีการเขียนโปรแกรมจูเนียร์บางปีสับสนว่าชั้นเรียนควรจะทำงานอย่างไรและลบสมาชิกที่เขาไม่ควรมี (โดยไม่ตั้งใจ) และNULLหลังจากนั้น เห็นได้ชัด) และสิ่งที่พัดขึ้นในด้านขวาหลังจากการเปิดตัวผลิตภัณฑ์และเราได้ "เรียนรู้วิธีที่ยากไว้วางใจเรา" ว่ามันจะดีกว่าที่จะเพียงแค่NULLตรวจสอบทุกอย่าง สำหรับฉันแล้วมันให้ความรู้สึกเหมือนการเขียนโปรแกรมลัทธิคาร์โก้ง่ายและเรียบง่าย เพื่อนร่วมงานที่มีความหมายดีบางคนพยายามอย่างจริงจังที่จะช่วยฉัน 'เข้าใจ' และดูว่าสิ่งนี้จะช่วยให้ฉันเขียนรหัสที่มีประสิทธิภาพมากขึ้นได้อย่างไร แต่ ... ฉันไม่สามารถรู้สึกเหมือนพวกเขาเป็นคนที่ไม่ได้รับมัน . มันสมเหตุสมผลสำหรับมาตรฐานการเข้ารหัสที่ต้องการให้ทุกตัวชี้เดียวที่ถูกอ้างถึงในฟังก์ชั่นถูกตรวจสอบNULLก่อน - แม้แต่สมาชิกข้อมูลส่วนตัว? (หมายเหตุ: เพื่อให้เป็นไปตามบริบทเราได้จัดทำอุปกรณ์อิเล็กทรอนิกส์สำหรับผู้บริโภคไม่ใช่ระบบควบคุมการจราจรทางอากาศหรือผลิตภัณฑ์ 'ความล้มเหลวเท่ากับคนตาย') แก้ไข : ในตัวอย่างข้างต้นผู้msgSender_ทำงานร่วมกันไม่จำเป็น …

3
ทำไมเราต้องใส่สมาชิกส่วนบุคคลไว้ในหัว?
ตัวแปรส่วนตัวเป็นวิธีการซ่อนความซับซ้อนและรายละเอียดการใช้งานให้กับผู้ใช้ของชั้นเรียน นี่เป็นฟีเจอร์ที่ค่อนข้างดี แต่ฉันไม่เข้าใจว่าทำไมใน c ++ เราต้องใส่ไว้ในส่วนหัวของชั้นเรียน ฉันเห็นข้อเสียที่น่ารำคาญสองประการนี้: มันตัดส่วนหัวจากผู้ใช้ มันบังคับให้รวบรวมไคลเอนต์ไลบรารีทั้งหมดใหม่ทุกครั้งที่มีการแก้ไข internals มีเหตุผลทางแนวคิดเบื้องหลังข้อกำหนดนี้หรือไม่ มันเป็นเพียงเพื่อความสะดวกในการทำงานออกคอมไพเลอร์?
62 c++  headers 

10
การใช้คอมไพเลอร์ C ++ เป็นเพียงการปฏิบัติที่เกินความจำเป็นหรือไม่
ดังนั้นฉันจึงทำงานเกี่ยวกับการออกแบบซอฟต์แวร์โดยใช้ C สำหรับโปรเซสเซอร์บางตัว ชุดเครื่องมือประกอบด้วยความสามารถในการคอมไพล์ C และ C ++ สำหรับสิ่งที่ฉันทำไม่มีการจัดสรรหน่วยความจำแบบไดนามิกในสภาพแวดล้อมนี้และโปรแกรมโดยรวมค่อนข้างง่าย ไม่ต้องพูดถึงว่าอุปกรณ์มีพลังประมวลผลหรือทรัพยากรเกือบไม่ ไม่จำเป็นต้องใช้ C ++ ใด ๆ เลย ที่ถูกกล่าวว่ามีไม่กี่สถานที่ที่ฉันทำฟังก์ชั่นมากไป (คุณสมบัติของ C ++) ฉันต้องการส่งข้อมูลประเภทต่าง ๆ และไม่รู้สึกอยากใช้printfการจัดรูปแบบสไตล์กับ%sอาร์กิวเมนต์ (หรืออะไรก็ตาม) บางประเภท ฉันเคยเห็นบางคนที่ไม่สามารถเข้าถึงคอมไพเลอร์ C ++ ที่ทำprintfสิ่งนี้ได้ แต่ในกรณีของฉันรองรับ C ++ พร้อมใช้งาน ตอนนี้ฉันแน่ใจว่าฉันอาจได้รับคำถามว่าทำไมฉันต้องโอเวอร์โหลดฟังก์ชันเพื่อเริ่มต้นด้วย ดังนั้นฉันจะพยายามตอบตอนนี้ ฉันต้องส่งข้อมูลประเภทต่าง ๆ ออกจากพอร์ตอนุกรมดังนั้นฉันจึงมีข้อมูลเกินจำนวนเล็กน้อยที่ส่งประเภทข้อมูลต่อไปนี้: unsigned char* const char* unsigned char const char ฉันแค่ไม่อยากมีวิธีการหนึ่งที่จัดการกับสิ่งเหล่านี้ทั้งหมด เมื่อฉันเรียกใช้ฟังก์ชั่นที่ฉันต้องการให้มันส่งออกพอร์ตอนุกรมฉันไม่มีทรัพยากรมากมายดังนั้นฉันจึงไม่ต้องการที่จะทำอะไรเลยนอกจากการส่งสัญญาณของฉัน มีคนอื่นเห็นโปรแกรมของฉันและถามฉันว่า "ทำไมคุณถึงใช้ไฟล์ …

7
การใช้ขอบเขตที่กำหนดสำหรับบิตแฟล็กใน C ++
enum X : int(C #) หรือenum class X : int(C ++ 11) เป็นชนิดที่มีเขตข้อมูลภายในที่ซ่อนของintที่สามารถเก็บค่าใด ๆ นอกจากนี้ค่าคงที่จำนวนหนึ่งที่กำหนดไว้ล่วงหน้าของXจะถูกกำหนดไว้ใน enum เป็นไปได้ที่จะส่งค่า enum ให้เป็นค่าจำนวนเต็มและในทางกลับกัน ทั้งหมดนี้เป็นจริงทั้งใน C # และ C ++ 11 ใน C # enums ไม่ได้ใช้เพียงเพื่อเก็บค่าของแต่ละบุคคล แต่ยังถืออยู่รวมกันค่าที่เหมาะสมของธงตามคำแนะนำของไมโครซอฟท์ เช่น enums (ปกติ แต่ไม่จำเป็น) ตกแต่งด้วย[Flags]แอตทริบิวต์ เพื่อทำให้ชีวิตของนักพัฒนาง่ายขึ้นผู้ประกอบการระดับบิต (OR, และอื่น ๆ ... ) จะได้รับการโหลดมากเกินไปเพื่อให้คุณสามารถทำสิ่งนี้ได้อย่างง่ายดาย (C #): void M(NumericType flags); M(NumericType.Sign …

10
แสดงดีกว่า () + ซ่อน () หรือ SetVisible (มองเห็นบูล) หรือไม่
ดีกว่าอะไรและเพราะอะไร (จากมุมมองของการออกแบบอินเตอร์เฟส): a) มีสองShow()และHide()ฟังก์ชั่น b) การมีSetVisible(bool visible)ฟังก์ชั่นเดียว แก้ไข: ตัวอย่างเช่นวัตถุบางอย่างมีสถานะการมองเห็นและฟังก์ชั่นนี้จะใช้ในการเปลี่ยนแปลง ค) มีทั้งสามShow(), Hide(), SetVisible(bool visible)ฟังก์ชั่น
59 java  c++  interfaces 

9
std :: shared_ptr เป็นทางเลือกสุดท้าย?
ผมก็แค่ดู "Going พื้นเมือง 2012" std::shared_ptrลำธารและผมสังเกตเห็นการอภิปรายเกี่ยวกับ ฉันรู้สึกประหลาดใจเล็กน้อยที่ได้ยินมุมมองเชิงลบของ Bjarne std::shared_ptrและความคิดเห็นของเขาว่าควรใช้เป็น "ทางเลือกสุดท้าย" เมื่ออายุการใช้งานของวัตถุไม่แน่นอน (ซึ่งฉันเชื่อตามที่เขาพูด ใครบ้างที่จะอธิบายสิ่งนี้ในเชิงลึกมากขึ้นอีกหน่อย? เราจะตั้งโปรแกรมโดยไม่ใช้std::shared_ptrและยังจัดการเวลาวัตถุได้อย่างปลอดภัยหรือไม่?

13
ปรัชญาที่อยู่เบื้องหลังพฤติกรรมที่ไม่ได้กำหนด
ข้อมูลจำเพาะ C \ C ++ ทำให้พฤติกรรมไม่เปิดจำนวนมากสำหรับคอมไพเลอร์เพื่อนำไปใช้ในทางของตัวเอง มีคำถามจำนวนมากที่มักถูกถามอยู่เสมอเกี่ยวกับสิ่งเดียวกันและเรามีโพสต์ที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้: https://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-abo https://stackoverflow.com/questions/4105120/what-is-undefined-behavior https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points คำถามของฉันไม่ได้เกี่ยวกับพฤติกรรมที่ไม่ได้กำหนดหรือมันแย่จริงๆ ฉันรู้ถึงอันตรายและการอ้างอิงพฤติกรรมที่ไม่ได้กำหนดที่เกี่ยวข้องส่วนใหญ่จากมาตรฐานดังนั้นโปรดงดเว้นการโพสต์คำตอบเกี่ยวกับความเลวร้ายของมัน คำถามนี้เกี่ยวกับปรัชญาเบื้องหลังการละทิ้งพฤติกรรมที่เปิดกว้างสำหรับการใช้งานคอมไพเลอร์ ฉันอ่านโพสต์บล็อกที่ยอดเยี่ยมที่ระบุว่าประสิทธิภาพเป็นเหตุผลหลัก ฉันสงสัยว่าการทำงานเป็นเพียงเกณฑ์ในการอนุญาตหรือมีปัจจัยอื่น ๆ ที่มีอิทธิพลต่อการตัดสินใจที่จะเปิดโอกาสให้คอมไพเลอร์ใช้งานได้หรือไม่? หากคุณมีตัวอย่างใด ๆ ที่จะกล่าวถึงพฤติกรรมที่ไม่ได้กำหนดไว้อย่างใดอย่างหนึ่งให้พื้นที่เพียงพอสำหรับคอมไพเลอร์เพื่อเพิ่มประสิทธิภาพโปรดแสดงรายการเหล่านั้น หากคุณทราบถึงปัจจัยอื่น ๆ นอกเหนือจากประสิทธิภาพโปรดกลับคำตอบของคุณพร้อมรายละเอียดที่เพียงพอ หากคุณไม่เข้าใจคำถามหรือไม่มีหลักฐาน / แหล่งข้อมูลเพียงพอที่จะตอบคำถามของคุณโปรดอย่าโพสต์คำตอบที่คาดเดาอย่างกว้าง ๆ

17
ปัญหาการเขียนโปรแกรมใดที่แก้ไขได้ดีที่สุดโดยใช้พอยน์เตอร์? [ปิด]
โดยทั่วไปฉันเข้าใจวิธีใช้พอยน์เตอร์ แต่ไม่ใช่วิธีที่ดีที่สุดในการใช้เพื่อทำให้โปรแกรมดีขึ้น โครงการหรือปัญหาที่ดีในการแก้ไขที่เกี่ยวข้องกับการใช้พอยน์เตอร์เพื่อให้ฉันสามารถเข้าใจได้ดีขึ้นคืออะไร

11
บทวิจารณ์สมัยใหม่ของ Java [ปิด]
ฉันเขียนโปรแกรมมาสองสามปีแล้วและฉันเริ่มต้นที่ Java และในเวลาที่ฉันพบแหล่งข้อมูลหลายแห่งที่อ้างว่า Java เป็นภาษาที่ด้อยกว่าไม่ทางใดก็ทางหนึ่ง ฉันรู้ดีว่าแต่ละภาษามีจุดแข็งและจุดอ่อน แต่หลายสิ่งที่ฉันได้อ่านเกี่ยวกับ Java ดูเหมือนจะล้าสมัย เหตุผลที่อ้างถึงบ่อยที่สุดสำหรับ Java ที่ด้อยกว่าคือมันช้ากว่าภาษาอื่น ๆ ที่รวบรวมเช่น C ++ หลายคนวิจารณ์นักออกแบบเกม Notch (ผู้พัฒนาเกม Minecraft) สำหรับการใช้งานจาวาเพราะขาดความชัดเจนในแผนกประสิทธิภาพ ฉันรู้ว่า Java ช้าลงมากในวันนี้ แต่มีการปรับปรุงมากมายตั้งแต่นั้นมาโดยเฉพาะอย่างยิ่งการรวบรวม JIT ฉันต้องการที่จะได้รับความคิดเห็นวัตถุประสงค์ของ Java เป็นภาษาวันนี้ ดังนั้นคำถามของฉันมี 4 ส่วน ประสิทธิภาพ. วันนี้ความเร็วของ Java เปรียบเทียบกับ C ++ อย่างไร ข เป็นไปได้ไหมที่จะสร้างชื่อ AAA ที่ทันสมัยโดยใช้ Java? ค Java ช้ากว่า C ++ เป็นพิเศษในด้านใดบ้าง? …

9
ความสามารถในการอ่านและการบำรุงรักษากรณีพิเศษของการเขียนการเรียกฟังก์ชันที่ซ้อนกัน
รูปแบบการเข้ารหัสของฉันสำหรับการเรียกใช้ฟังก์ชันที่ซ้อนกันมีดังต่อไปนี้: var result_h1 = H1(b1); var result_h2 = H2(b2); var result_g1 = G1(result_h1, result_h2); var result_g2 = G2(c1); var a = F(result_g1, result_g2); ฉันเพิ่งเปลี่ยนเป็นแผนกที่ใช้รูปแบบการเข้ารหัสต่อไปนี้เป็นอย่างมาก: var a = F(G1(H1(b1), H2(b2)), G2(c1)); ผลของวิธีการเข้ารหัสของฉันคือในกรณีที่ฟังก์ชั่นการขัดข้อง Visual Studio สามารถเปิดการถ่ายโอนข้อมูลที่สอดคล้องกันและระบุบรรทัดที่ปัญหาเกิดขึ้น (ฉันกังวลเป็นพิเศษเกี่ยวกับการละเมิดการเข้าถึง) ฉันกลัวว่าในกรณีที่เกิดความผิดพลาดเนื่องจากปัญหาเดียวกันที่ตั้งโปรแกรมไว้ในวิธีแรกฉันจะไม่สามารถรู้ได้ว่าฟังก์ชันใดที่ทำให้เกิดความผิดพลาด ในทางกลับกันยิ่งการประมวลผลที่คุณใส่ในบรรทัดมากขึ้นเท่าไรคุณก็ยิ่งได้รับตรรกะมากขึ้นในหน้าเดียวซึ่งจะช่วยเพิ่มความสามารถในการอ่าน ความกลัวของฉันถูกต้องหรือฉันขาดอะไรไปและโดยทั่วไปแล้วสิ่งใดที่เป็นที่นิยมในสภาพแวดล้อมเชิงพาณิชย์ อ่านหรือบำรุงรักษา? ฉันไม่รู้ว่ามันเกี่ยวข้องหรือไม่ แต่เรากำลังทำงานใน C ++ (STL) / C #

7
ทำไมไม่มีการสร้าง 'สุดท้าย' ใน C ++
การจัดการข้อยกเว้นใน C ++ นั้น จำกัด ให้ลอง / โยน / จับ ไม่เหมือนกับ Object Pascal, Java, C # และ Python แม้ใน C ++ 11 finallyโครงสร้างจะไม่ถูกนำมาใช้ ฉันได้เห็นวรรณกรรม C ++ จำนวนมากที่พูดถึง "ข้อยกเว้นรหัสปลอดภัย" Lippman เขียนว่ารหัสความปลอดภัยยกเว้นเป็นหัวข้อที่มีความสำคัญ แต่ขั้นสูงและยากเกินกว่าขอบเขตของไพรเมอร์ของเขา - ซึ่งดูเหมือนว่าบอกเป็นนัยว่ารหัสความปลอดภัยไม่ได้เป็นพื้นฐานของ C ++ Herb Sutter อุทิศ 10 บทในหัวข้อในภาษา C ++ อันยอดเยี่ยมของเขา! สำหรับฉันแล้วดูเหมือนว่าปัญหาต่าง ๆ ที่เกิดขึ้นเมื่อพยายามเขียน "รหัสที่ปลอดภัยยกเว้น" สามารถแก้ไขได้ค่อนข้างดีหากมีการใช้finallyงานโครงสร้างซึ่งทำให้โปรแกรมเมอร์สามารถมั่นใจได้ว่าแม้ในกรณีที่มีข้อยกเว้นโปรแกรมสามารถคืนค่าได้ ไปยังสถานะที่ปลอดภัยมั่นคงปราศจากการรั่วไหลใกล้กับจุดจัดสรรทรัพยากรและรหัสที่อาจเป็นปัญหา ในฐานะที่เป็นโปรแกรมเมอร์ …
57 c++  exceptions 

7
เหตุใดจึงมีคลาสสตริงจำนวนมากในหน้าของ std :: string?
สำหรับฉันแล้วดูเหมือนว่าไลบรารี C ++ ที่ใหญ่กว่านั้นจะสร้างประเภทสตริงของตัวเองขึ้นมา ในรหัสลูกค้าที่คุณอาจจะต้องใช้อย่างใดอย่างหนึ่งจากห้องสมุด ( QString, CString, fbstringฯลฯ ฉันแน่ใจว่าทุกคนสามารถชื่อไม่กี่) หรือเก็บแปลงระหว่างชนิดมาตรฐานและเป็นหนึ่งในการใช้ห้องสมุด (ซึ่งใช้เวลาส่วนใหญ่เกี่ยวข้องกับการ อย่างน้อยหนึ่งสำเนา) ดังนั้นมีความผิดพลาดบางอย่างหรือมีสิ่งผิดปกติstd::string(เช่นauto_ptrความหมายไม่ดี) หรือไม่? มีการเปลี่ยนแปลงใน C ++ 11 หรือไม่?
56 c++ 

3
แลมบ์ดาคืออะไรและทำไมจึงมีประโยชน์ [ปิด]
จนถึงตอนนี้ฉันได้ยินเกี่ยวกับ: แลมบ์ดาแคลคูลัส การเขียนโปรแกรมแลมบ์ดา นิพจน์แลมบ์ดา ฟังก์ชั่นแลมบ์ดา ซึ่งดูเหมือนว่าทั้งหมดจะเกี่ยวข้องกับการเขียนโปรแกรมการทำงาน ... เห็นได้ชัดว่ามันจะถูกรวมเข้ากับ C ++ 1x ดังนั้นฉันอาจเข้าใจได้ดีขึ้นในตอนนี้: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions ใครบางคนสามารถกำหนดสิ่ง lambdas สิ่งสั้น ๆ และให้ที่มันจะมีประโยชน์?

15
ทำไมเรามีการเพิ่ม postfix?
ข้อจำกัดความรับผิดชอบ : ฉันรู้ดีว่าความหมายของคำนำหน้าและการเพิ่มคำนำหน้า ดังนั้นโปรดอย่าอธิบายให้ฉันฟังว่ามันทำงานอย่างไร การอ่านคำถามเกี่ยวกับการโอเวอร์โฟลว์ของสแต็คฉันไม่สามารถช่วยได้ แต่สังเกตว่าโปรแกรมเมอร์สับสนโดยผู้ประกอบการเพิ่ม postfix ซ้ำแล้วซ้ำอีก จากคำถามนี้จะเกิดขึ้น: มีกรณีการใช้งานใดบ้างที่การเพิ่ม postfix ให้ประโยชน์ที่แท้จริงในแง่ของคุณภาพของรหัส? ให้ฉันอธิบายคำถามของฉันด้วยตัวอย่าง นี่คือการใช้งานแบบย่อของstrcpy: while (*dst++ = *src++); แต่นั่นไม่ใช่รหัสการจัดทำเอกสารด้วยตัวเองที่แน่นอนที่สุดในหนังสือของฉัน (และมันสร้างคำเตือนที่น่ารำคาญสองประการในคอมไพเลอร์สติ) ดังนั้นมีอะไรผิดปกติกับทางเลือกต่อไปนี้? while (*dst = *src) { ++src; ++dst; } จากนั้นเราสามารถกำจัดการมอบหมายที่สับสนในสภาพและรับรหัสที่ไม่มีการเตือนอย่างสมบูรณ์: while (*src != '\0') { *dst = *src; ++src; ++dst; } *dst = '\0'; (ใช่ฉันรู้srcและdstจะมีค่าสิ้นสุดที่แตกต่างกันในโซลูชันทางเลือกเหล่านี้ แต่เนื่องจากstrcpyผลตอบแทนทันทีหลังจากลูปจึงไม่สำคัญในกรณีนี้) ดูเหมือนว่าจุดประสงค์ของการเพิ่ม postfix คือการสร้างโค้ดให้สั้นที่สุด ฉันเพียงแค่ล้มเหลวที่จะเห็นว่านี่คือสิ่งที่เราควรพยายาม …
55 c++  c  postfix 

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