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

จัดทำ C ++ FAQ ที่ทำงานร่วมกันและแก้ไขโดยชุมชน

9
เหตุใดความผันผวนจึงไม่ถือว่ามีประโยชน์ในการเขียนโปรแกรม C หรือ C ++ แบบมัลติเธรด
ดังที่แสดงในคำตอบที่ฉันเพิ่งโพสต์เมื่อเร็ว ๆ นี้ดูเหมือนว่าฉันจะสับสนเกี่ยวกับยูทิลิตี้ (หรือขาดของมัน) volatileในบริบทการเขียนโปรแกรมแบบมัลติเธรด volatileความเข้าใจของฉันนี้เวลาใดตัวแปรอาจมีการเปลี่ยนแปลงนอกไหลของการควบคุมของชิ้นส่วนของรหัสเข้าถึงมันว่าตัวแปรที่ควรได้รับการประกาศให้เป็น ตัวจัดการสัญญาณการลงทะเบียน I / O และตัวแปรที่แก้ไขโดยเธรดอื่นทั้งหมดล้วนเป็นสถานการณ์ดังกล่าว ดังนั้นถ้าคุณมี int ส่วนกลางfooและfooถูกอ่านโดยหนึ่งเธรดและตั้งค่าเป็นอะตอมต่อโดยเธรดอื่น (อาจใช้คำสั่งเครื่องที่เหมาะสม) เธรดการอ่านจะเห็นสถานการณ์นี้ในแบบเดียวกับที่มันเห็นตัวแปร tweaked โดยตัวจัดการสัญญาณหรือ แก้ไขโดยเงื่อนไขฮาร์ดแวร์ภายนอกและดังนั้นจึงfooควรประกาศvolatile(หรือสำหรับสถานการณ์แบบมัลติเธรดเข้าถึงได้ด้วยโหลดหน่วยความจำไม่พอใจซึ่งน่าจะเป็นทางออกที่ดีกว่า) ฉันผิดและอยู่ที่ไหน

7
ข้อดีของการใช้ nullptr คืออะไร
ชิ้นส่วนของรหัสนี้แนวคิดจะเป็นสิ่งเดียวกันสำหรับสามตัวชี้ (เริ่มต้นชี้ปลอดภัย): int* p1 = nullptr; int* p2 = NULL; int* p3 = 0; ดังนั้นสิ่งที่เป็นข้อดีของการกำหนดตัวชี้nullptrมากกว่ากำหนดให้ค่าNULLหรือ0?
163 c++  c++11  null  c++-faq  nullptr 

5
การประกาศหลักที่เหมาะสมคืออะไร?
ลายเซ็นที่เหมาะสมของmainฟังก์ชั่นใน C ++ คืออะไร? ประเภทผลตอบแทนที่ถูกต้องคืออะไรและการคืนค่ามาจากmainอะไร ประเภทพารามิเตอร์ที่อนุญาตคืออะไรและมีความหมายอย่างไร นี่เป็นระบบเฉพาะหรือไม่ กฎเหล่านั้นเปลี่ยนไปตามกาลเวลาหรือไม่? จะเกิดอะไรขึ้นถ้าฉันละเมิดพวกเขา
147 c++  main  c++-faq 

3
ตัวจัดการ iomanip ใดที่ 'เหนียว'?
ฉันเพิ่งมีปัญหาในการสร้างstringstreamอันเนื่องมาจากความจริงที่ว่าฉันคิดว่าไม่ถูกต้องstd::setw()จะส่งผลกระทบต่อสายน้ำสำหรับการแทรกทุกครั้งจนกว่าฉันจะเปลี่ยนมันอย่างชัดเจน อย่างไรก็ตามจะไม่มีการตั้งค่าเสมอหลังจากการแทรก // With timestruct with value of 'Oct 7 9:04 AM' std::stringstream ss; ss.fill('0'); ss.setf(ios::right, ios::adjustfield); ss << setw(2) << timestruct.tm_mday; ss << timestruct.tm_hour; ss << timestruct.tm_min; std::string filingTime = ss.str(); // BAD: '0794' ดังนั้นฉันมีคำถามจำนวนมาก: ทำไมจึงเป็นsetw()เช่นนี้? มีผู้ควบคุมอื่น ๆ ด้วยวิธีนี้หรือไม่? มีความแตกต่างในพฤติกรรมระหว่างstd::ios_base::width()และstd::setw()? ในที่สุดก็มีการอ้างอิงออนไลน์ที่ชัดเจนเอกสารพฤติกรรมนี้ เอกสารผู้ขายของฉัน (MS Visual Studio 2005) ดูเหมือนจะไม่แสดงสิ่งนี้อย่างชัดเจน
140 c++  c++-faq 

4
ฉันจะเลือกคอนเทนเนอร์ไลบรารีมาตรฐานใน C ++ 11 อย่างมีประสิทธิภาพได้อย่างไร
มีรูปภาพที่รู้จักกันดี (ข้อมูลโกง) ที่เรียกว่า "C ++ Container choice" เป็นผังงานเพื่อเลือกภาชนะที่ดีที่สุดสำหรับการใช้งานที่ต้องการ มีใครรู้บ้างว่ามีเวอร์ชัน C ++ 11 อยู่แล้วหรือไม่? นี่คือรายการก่อนหน้า:
136 c++  c++11  c++-faq 

9
เหตุใดการใช้ 'ใหม่' จึงทำให้หน่วยความจำรั่ว?
ฉันเรียนรู้ C # ก่อนและตอนนี้ฉันเริ่มต้นด้วย C ++ ตามที่ฉันเข้าใจโอเปอเรเตอร์newใน C ++ ไม่เหมือนกับตัวดำเนินการใน C # คุณสามารถอธิบายสาเหตุของการรั่วไหลของหน่วยความจำในโค้ดตัวอย่างนี้ได้หรือไม่? class A { ... }; struct B { ... }; A *object1 = new A(); B object2 = *(new B());

5
ตัวดำเนินการเข้าถึงสมาชิกมากเกินไป ->,. *
ผมเข้าใจมากไปผู้ประกอบการส่วนใหญ่มีข้อยกเว้นของผู้ประกอบการเข้าถึงสมาชิกที่->, .*, ->*ฯลฯ โดยเฉพาะอย่างยิ่งสิ่งที่ส่งผ่านไปยังฟังก์ชันตัวดำเนินการเหล่านี้และสิ่งที่ควรส่งคืน? ฟังก์ชันตัวดำเนินการ (เช่นoperator->(...)) รู้ได้อย่างไรว่าสมาชิกใดถูกอ้างถึง? มันรู้ได้ไหม? มันจำเป็นต้องรู้หรือไม่? สุดท้ายมีข้อพิจารณาใดบ้างที่ต้องนำมาพิจารณา? ตัวอย่างเช่นเมื่อมีการใช้งานมากเกินไปoperator[]โดยทั่วไปคุณจะต้องมีทั้งเวอร์ชัน const และไม่ใช่ const ตัวดำเนินการเข้าถึงสมาชิกต้องการเวอร์ชัน const และ non-const หรือไม่?

7
ความหลากหลายใน C ++
AFAIK: C ++ มีความแตกต่างกันสามประเภท ฟังก์ชันเสมือนจริง ชื่อฟังก์ชันมากเกินไป ตัวดำเนินการมากเกินไป นอกเหนือจากความหลากหลายสามประเภทข้างต้นแล้วยังมีความหลากหลายประเภทอื่น ๆ อีกด้วย: เวลาทำงาน เวลารวบรวม ความแตกต่างแบบเฉพาะกิจ พหุนามพาราเมตริก ฉันรู้ว่าความหลากหลายของรันไทม์สามารถทำได้โดยฟังก์ชันเสมือนจริง และความแตกต่างแบบคงที่สามารถทำได้โดยฟังก์ชันเทมเพลต แต่สำหรับอีกสองคน ความแตกต่างแบบเฉพาะกิจ polymorphism พาราเว็บไซต์กล่าวว่า , โพลีมอร์ฟิซึมเฉพาะกิจ: หากช่วงของประเภทจริงที่สามารถใช้ได้มี จำกัด และต้องระบุชุดค่าผสมทีละรายการก่อนใช้งานสิ่งนี้เรียกว่า ad-hoc polymorphism ความหลากหลายเชิงพาราเมตริก: หากเขียนโค้ดทั้งหมดโดยไม่ระบุประเภทใดประเภทหนึ่งดังนั้นจึงสามารถใช้งานได้อย่างโปร่งใสกับประเภทใหม่ ๆ จำนวนมากเรียกว่าพหุนามพาราเมตริก ฉันแทบไม่เข้าใจพวกเขาเลย :( ใครช่วยอธิบายทั้งสองอย่างด้วยตัวอย่างได้ไหม ฉันหวังว่าคำตอบสำหรับคำถามนี้จะเป็นประโยชน์สำหรับผู้ผ่านการคัดเลือกใหม่จากวิทยาลัยของพวกเขา


4
เมื่อใดที่จะสร้างประเภทที่ไม่สามารถเคลื่อนย้ายได้ใน C ++ 11
ฉันแปลกใจที่สิ่งนี้ไม่ปรากฏในผลการค้นหาของฉันฉันคิดว่ามีคนถามเรื่องนี้มาก่อนเนื่องจากประโยชน์ของความหมายการย้ายใน C ++ 11: เมื่อใดที่ฉันต้อง (หรือเป็นความคิดที่ดีสำหรับฉัน) ทำให้คลาสไม่สามารถเคลื่อนย้ายได้ใน C ++ 11 (เหตุผลอื่นนอกเหนือจากปัญหาความเข้ากันได้กับรหัสที่มีอยู่นั่นคือ)

10
การใช้งาน stack และ heap ที่เหมาะสมใน C ++?
ฉันเขียนโปรแกรมมาระยะหนึ่งแล้ว แต่ส่วนใหญ่เป็น Java และ C # ฉันไม่เคยต้องจัดการหน่วยความจำด้วยตัวเองเลย ฉันเพิ่งเริ่มเขียนโปรแกรมใน C ++ และฉันรู้สึกสับสนเล็กน้อยว่าเมื่อใดที่ฉันควรจัดเก็บสิ่งต่างๆบนสแต็กและเมื่อใดที่จะเก็บไว้ในฮีป ความเข้าใจของฉันคือตัวแปรที่ถูกเข้าถึงบ่อยมากควรถูกเก็บไว้ในสแต็กและอ็อบเจกต์ตัวแปรที่ไม่ค่อยได้ใช้และโครงสร้างข้อมูลขนาดใหญ่ทั้งหมดควรถูกเก็บไว้ในฮีป นี่ถูกต้องหรือฉันไม่ถูกต้อง?

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

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

8
เหตุใดฟังก์ชันอินไลน์ของ C ++ จึงอยู่ในส่วนหัว
หมายเหตุนี่ไม่ใช่คำถามเกี่ยวกับวิธีการใช้ฟังก์ชันแบบอินไลน์หรือวิธีการทำงานอีกต่อไปว่าทำไมพวกเขาถึงทำในแบบที่เป็นอยู่ การประกาศฟังก์ชันสมาชิกคลาสไม่จำเป็นต้องกำหนดฟังก์ชันเนื่องจากinlineเป็นเพียงการนำฟังก์ชันไปใช้งานจริงเท่านั้น ตัวอย่างเช่นในไฟล์ส่วนหัว: struct foo{ void bar(); // no need to define this as inline } เหตุใดการใช้ฟังก์ชันคลาสแบบอินไลน์จึงต้องอยู่ในไฟล์ส่วนหัว? เหตุใดฉันจึงไม่สามารถใส่ฟังก์ชันอินไลน์ใน.cppไฟล์ได้ ถ้าฉันพยายามใส่คำจำกัดความแบบอินไลน์ใน.cppไฟล์ฉันจะได้รับข้อผิดพลาดตามบรรทัดของ: error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

1
const หมายถึง thread-safe ใน C ++ 11 หรือไม่?
ผมได้ยินว่าconstหมายถึงด้ายปลอดภัยในC ++ 11 เป็นเช่นนั้นจริงหรือ? หมายความว่าconstตอนนี้เทียบเท่าของJava 's synchronized? พวกเขาใช้คีย์เวิร์ดหมดหรือไม่

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