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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

16
C ++ รองรับการบล็อก 'ที่สุด' หรือไม่? (และนี่คือ 'RAII' ที่ฉันคอยฟัง?)
C ++ รองรับการบล็อก ' ที่สุด ' หรือไม่? อะไรคือ สำนวน RAII ? อะไรคือความแตกต่างระหว่างคำสั่ง RAII ของ C ++ กับการใช้คำสั่ง 'C' ?
272 c++  exception  raii  finally  c++-faq 

1
“ int main () {(([] () {}) ());}” ใช้ได้อย่างไร ++
ฉันเพิ่งเจอชิ้นส่วนที่ลึกลับของรหัสต่อไปนี้ int main(){(([](){})());} จัดรูปแบบใหม่ดังต่อไปนี้เพื่อให้อ่านง่ายขึ้น: int main(){ (([](){})()); // Um... what?!?! } แต่ฉันไม่เข้าใจว่า(([](){})())รหัสถูกต้องอย่างไร มันดูเหมือนไวยากรณ์ตัวชี้ฟังก์ชันไม่ได้ มันไม่สามารถเป็นกลอุบายการบรรทุกเกินพิกัดบางอย่างได้ รหัสคอมไพล์ตามที่เป็นอยู่ Google ไม่ได้ช่วยอะไรมากนักในการค้นหาสัญลักษณ์ทั้งหมด แต่มันก็คอมไพล์ใน Visual Studio 2010 และไม่มีผลอะไร ไม่มีข้อผิดพลาดและไม่มีคำเตือน ดังนั้นดูเหมือนรหัสที่ถูกต้อง ผมไม่เคยเห็นรหัสที่ถูกต้องใด ๆ ที่อยู่นอกมหัศจรรย์ของJavascriptและC คำแนะนำการทำงาน บางคนสามารถอธิบายได้ว่าวิธีนี้ใช้ได้อย่างไร C ++
271 c++  c++11  lambda  syntax 



10
เราควรส่ง shared_ptr โดยอ้างอิงหรือตามค่าหรือไม่
เมื่อฟังก์ชั่นใช้shared_ptr(จากบูสต์หรือ C ++ 11 STL) คุณจะผ่านมัน: โดยอ้างอิง const: void foo(const shared_ptr<T>& p) หรือโดยค่า: void foo(shared_ptr<T> p)? ฉันชอบวิธีแรกเพราะฉันสงสัยว่ามันจะเร็วกว่า แต่สิ่งนี้คุ้มหรือไม่ คุณกรุณาให้เหตุผลในการเลือกของคุณหรือถ้าเป็นเช่นนั้นทำไมคุณคิดว่ามันไม่สำคัญ
270 c++  c++11  boost  shared-ptr 

16
เหตุใด C ++ จึงไม่มีตัวรวบรวมขยะ
ฉันไม่ได้ถามคำถามนี้เพราะข้อดีของการเก็บขยะก่อนอื่น เหตุผลหลักของฉันในการถามนี้คือฉันรู้ว่า Bjarne Stroustrup บอกว่า C ++ จะมีตัวรวบรวมขยะในบางเวลา พร้อมที่กล่าวว่าทำไมมันไม่ได้ถูกเพิ่มเข้ามา? มีนักสะสมขยะสำหรับ C ++ อยู่แล้ว นี่เป็นเพียงหนึ่งในประเภทที่ "พูดง่ายกว่าทำ" หรือมีเหตุผลอื่น ๆ ที่ยังไม่ถูกเพิ่ม (และจะไม่ถูกเพิ่มใน C ++ 11)? ลิงก์ข้าม: ตัวรวบรวมขยะสำหรับ C ++ เพื่อชี้แจงฉันเข้าใจเหตุผลที่ C ++ ไม่มีตัวรวบรวมขยะเมื่อสร้างครั้งแรก ฉันสงสัยว่าทำไมไม่สามารถเพิ่มนักสะสม

8
ฉันจะสร้างส่วนต่อประสานผู้ใช้แบบกราฟิกใน C ++ ได้อย่างไร [ปิด]
เป็นการยากที่จะบอกสิ่งที่ถูกถามที่นี่ คำถามนี้คลุมเครือคลุมเครือไม่สมบูรณ์กว้างเกินไปหรือโวหารและไม่สามารถตอบได้อย่างสมเหตุสมผลในรูปแบบปัจจุบัน สำหรับความช่วยเหลือในการทำความเข้าใจคำถามนี้เพื่อที่จะสามารถเปิด, ไปที่ศูนย์ช่วยเหลือ ปิดให้บริการใน8 ปีที่ผ่านมา โปรแกรม C ++ ทั้งหมดของฉันจนถึงตอนนี้ใช้อินเตอร์เฟสบรรทัดคำสั่งและภาษาอื่น ๆ ที่ฉันมีประสบการณ์คือ PHP ซึ่งไม่รองรับ GUI ฉันจะเริ่มต้นด้วยการเขียนโปรแกรมอินเทอร์เฟซผู้ใช้แบบกราฟิกใน C ++ ได้ที่ไหน ฉันจะสร้างได้อย่างไร

23
ฉันจะรับไดเรกทอรีที่โปรแกรมกำลังทำงานได้อย่างไร
มีวิธีที่ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์มและระบบไม่เชื่อเรื่องพระเจ้าเพื่อให้ได้เส้นทางแบบเต็มของไดเรกทอรีจากที่โปรแกรมกำลังทำงานโดยใช้ C / C ++? เพื่อไม่ให้สับสนกับไดเรกทอรีการทำงานปัจจุบัน (โปรดอย่าแนะนำห้องสมุดเว้นแต่ว่าเป็นไลบรารีมาตรฐานเช่น clib หรือ STL) (หากไม่มีวิธีการแพลตฟอร์ม / ระบบไม่เชื่อเรื่องพระเจ้าคำแนะนำที่ทำงานใน Windows และ Linux สำหรับระบบไฟล์ที่เฉพาะเจาะจงก็ยินดีต้อนรับเช่นกัน)
269 c++  c  working-directory 


11
ทำไม f (i = -1, i = -1) พฤติกรรมที่ไม่ได้กำหนด?
ฉันกำลังอ่านเกี่ยวกับลำดับของการละเมิดการประเมินผลและพวกเขายกตัวอย่างที่ทำให้ฉันสงสัย 1) หากผลข้างเคียงของวัตถุสเกลาร์นั้นไม่ได้ถูกจัดลำดับสัมพันธ์กับผลข้างเคียงอื่นในวัตถุสเกลาร์เดียวกันพฤติกรรมนั้นจะไม่ได้กำหนดไว้ // snip f(i = -1, i = -1); // undefined behavior ในบริบทiนี้เป็นวัตถุสเกลาร์ซึ่งเห็นได้ชัดว่าหมายถึง ประเภทเลขคณิต (3.9.1), ประเภทการแจงนับ, ประเภทตัวชี้, ตัวชี้ไปยังประเภทสมาชิก (3.9.2), std :: nullptr_t, และเวอร์ชันที่ผ่านการรับรอง cv ของประเภทเหล่านี้ (3.9.3) เรียกว่าประเภทสเกลาร์ ฉันไม่เห็นว่าคำสั่งนั้นคลุมเครือในกรณีนั้นอย่างไร สำหรับฉันดูเหมือนว่าไม่ว่าอาร์กิวเมนต์แรกหรืออาร์กิวเมนต์ที่สองจะได้รับการประเมินก่อนiจะสิ้นสุดลง-1และอาร์กิวเมนต์ทั้งสองก็เช่น-1กัน บางคนช่วยอธิบายได้ไหม? UPDATE ฉันขอขอบคุณการอภิปรายทั้งหมด ถึงตอนนี้ฉันชอบคำตอบของ @ harmicมากเพราะมันทำให้เกิดข้อผิดพลาดและความซับซ้อนของการกำหนดคำสั่งนี้แม้จะมองไปข้างหน้าอย่างรวดเร็วในทันที @ acheong87ชี้ให้เห็นปัญหาบางอย่างที่เกิดขึ้นเมื่อใช้การอ้างอิง แต่ฉันคิดว่ามันเป็นมุมฉากกับผลข้างเคียงที่ตามมาของคำถามนี้ สรุป เนื่องจากคำถามนี้ได้รับความสนใจเป็นจำนวนมากฉันจะสรุปประเด็น / คำตอบหลัก ๆ ก่อนอื่นให้ฉันพูดนอกเรื่องเล็ก ๆ เพื่อชี้ให้เห็นว่า "ทำไม" สามารถมีความหมายที่แตกต่างกันอย่างใกล้ชิด …

14
วิธีสิ้นสุดรหัส C ++
ฉันต้องการให้รหัส C ++ หยุดทำงานหากตรงตามเงื่อนไขบางประการ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร ดังนั้น ณ จุดใดถ้าifคำสั่งเป็นจริงยุติโค้ดเช่นนี้: if (x==1) { kill code; }
267 c++ 

4
เหตุใดฉันจึงไม่ #include <bits / stdc ++. h>
ฉันโพสต์คำถามด้วยรหัสของฉันซึ่ง#includeคำสั่งเพียงอย่างเดียวคือ: #include &lt;bits/stdc++.h&gt; ครูของฉันบอกให้ฉันทำสิ่งนี้ แต่ในส่วนความเห็นฉันได้รับแจ้งว่าฉันไม่ควรทำ ทำไม?

30
จะหลีกเลี่ยงการเชื่อมโยง“ ถ้า” ได้อย่างไร?
สมมติว่าฉันมีรหัสหลอกนี้: bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (conditionC){ ... } } } executeThisFunctionInAnyCase(); ฟังก์ชั่นexecuteStepXควรจะดำเนินการถ้าหากว่าก่อนหน้านี้ประสบความสำเร็จ ไม่ว่าในกรณีใดexecuteThisFunctionInAnyCaseฟังก์ชันควรถูกเรียกใช้ในตอนท้าย ฉันเป็นมือใหม่ในการเขียนโปรแกรมดังนั้นขออภัยสำหรับคำถามพื้นฐานมาก: มีวิธี (ใน C / C ++ เป็นต้น) เพื่อหลีกเลี่ยงifสายโซ่ยาว ๆ ที่ผลิต "pyramid of code" ที่ค่าใช้จ่ายของการอ่านรหัสได้ง่าย ? ฉันรู้ว่าถ้าเราสามารถข้ามการexecuteThisFunctionInAnyCaseเรียกใช้ฟังก์ชันรหัสอาจง่ายขึ้นเป็น: bool conditionA = executeStepA(); if (!conditionA) return; …

6
การประกาศตัวแปรภายในลูปการฝึกฝนที่ดีหรือการฝึกฝนที่ไม่ดี?
คำถาม # 1: การประกาศตัวแปรภายในลูปเป็นแนวปฏิบัติที่ดีหรือไม่ดีหรือไม่? ฉันได้อ่านเธรดอื่น ๆ เกี่ยวกับว่ามีปัญหาเรื่องประสิทธิภาพหรือไม่ (ส่วนใหญ่บอกว่าไม่มี) และคุณควรประกาศตัวแปรใกล้เคียงกับที่จะใช้งาน สิ่งที่ฉันสงสัยคือควรหลีกเลี่ยงสิ่งนี้หรือไม่หรือเป็นที่ต้องการจริง ตัวอย่าง: for(int counter = 0; counter &lt;= 10; counter++) { string someString = "testing"; cout &lt;&lt; someString; } คำถาม # 2:คอมไพเลอร์ส่วนใหญ่รู้หรือไม่ว่ามีการประกาศตัวแปรแล้วและข้ามส่วนนั้นหรือไม่หรือมันสร้างจุดในหน่วยความจำทุกครั้งหรือไม่

17
ส่งต่อประกาศ enum ใน C ++
ฉันกำลังพยายามทำสิ่งต่อไปนี้: enum E; void Foo(E e); enum E {A, B, C}; ซึ่งคอมไพเลอร์ปฏิเสธ ฉันได้ดู Google อย่างรวดเร็วและฉันทามติดูเหมือนว่า "คุณทำไม่ได้" แต่ฉันไม่เข้าใจว่าทำไม มีใครอธิบายได้บ้าง ความกระจ่างที่ 2: ฉันกำลังทำสิ่งนี้เนื่องจากฉันมีวิธีการส่วนตัวในชั้นเรียนที่กล่าวว่า enum และฉันไม่ต้องการให้คุณค่าของ enum เปิดเผยดังนั้นตัวอย่างเช่นฉันไม่ต้องการให้ใครรู้ว่า E ถูกกำหนดเป็น enum E { FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X } เนื่องจากโครงการ X ไม่ใช่สิ่งที่ฉันต้องการให้ผู้ใช้ของฉันรู้ ดังนั้นฉันต้องการส่งต่อประกาศ enum เพื่อให้ฉันสามารถใส่วิธีการส่วนตัวในไฟล์ส่วนหัวประกาศ enum ภายใน cpp และแจกจ่ายไฟล์ไลบรารีที่สร้างขึ้นและส่วนหัวให้กับผู้คน สำหรับคอมไพเลอร์ - มันคือ GCC
264 c++  enums 

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