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

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

5
จุดประสงค์ของ g ++ -Wreorder คืออะไร
ตัวเลือก g ++ -Wall รวมถึง - คำสั่งซื้อ ตัวเลือกนี้ทำอะไรอธิบายไว้ด้านล่าง ไม่ชัดเจนสำหรับฉันว่าทำไมบางคนถึงสนใจ (โดยเฉพาะอย่างยิ่งพอที่จะเปิดใช้งานตามค่าเริ่มต้นใน -Wall) - คำสั่งซื้อ (C ++ เท่านั้น) เตือนเมื่อลำดับของสมาชิกเริ่มต้นที่กำหนดในรหัสไม่ได้ ตรงกับคำสั่งที่พวกเขาจะต้องดำเนินการ ตัวอย่างเช่น struct A { int i; int j; A (): j (0), i (1) {} }; คอมไพเลอร์จะจัดเรียง initializers สมาชิกใหม่สำหรับ i และ j to ตรงกับคำสั่งประกาศของสมาชิกปล่อยเตือนไปที่ ผล คำเตือนนี้เปิดใช้งานโดย -Wall

29
เหตุใดจึงใช้ส่วนนำหน้ากับตัวแปรสมาชิกในคลาส C ++
รหัส C ++ จำนวนมากใช้ระเบียบการสร้างประโยคเพื่อทำเครื่องหมายตัวแปรสมาชิก ตัวอย่างทั่วไป ได้แก่ m_ memberNameสำหรับสมาชิกสาธารณะ (ที่สมาชิกสาธารณะถูกนำมาใช้เลย) _ memberNameสำหรับสมาชิกส่วนตัวหรือสมาชิกทั้งหมด คนอื่นพยายามบังคับใช้สมาชิกนี้ - > เมื่อใดก็ตามที่มีการใช้ตัวแปรสมาชิก จากประสบการณ์ของฉันฐานรหัสขนาดใหญ่ส่วนใหญ่ล้มเหลวในการใช้กฎดังกล่าวอย่างสม่ำเสมอ ในภาษาอื่น ๆ อนุสัญญาเหล่านี้แพร่หลายน้อยกว่ามาก ฉันเห็นมันเป็นครั้งคราวเท่านั้นใน Java หรือรหัส C # ฉันคิดว่าฉันไม่เคยเห็นมันในรหัส Ruby หรือ Python ดังนั้นดูเหมือนว่าจะมีแนวโน้มด้วยภาษาที่ทันสมัยกว่าที่จะไม่ใช้มาร์กอัปพิเศษสำหรับตัวแปรสมาชิก อนุสัญญานี้ยังคงมีประโยชน์ทุกวันนี้ใน C ++ หรือว่าเป็นเพียงความผิดสมัย โดยเฉพาะอย่างยิ่งมันถูกใช้อย่างไม่สอดคล้องกันทั่วทั้งห้องสมุด ภาษาอื่น ๆ ที่แสดงให้เห็นว่าสามารถทำได้โดยไม่ต้องนำหน้าสมาชิก?

5
คอมไพเลอร์ C ++ ใดที่มีการปรับให้เหมาะสมแบบเรียกซ้ำ
ดูเหมือนว่าสำหรับฉันแล้วมันจะทำงานได้อย่างสมบูรณ์แบบดีในการปรับการเรียกซ้ำแบบหางทั้งใน C และ C ++ แต่ในขณะที่การดีบั๊กฉันไม่เคยเห็นเฟรมสแต็คที่ระบุการเพิ่มประสิทธิภาพนี้ นั่นเป็นสิ่งที่ดีเพราะกองซ้อนบอกฉันว่าการเรียกซ้ำนั้นลึกซึ้งเพียงใด อย่างไรก็ตามการเพิ่มประสิทธิภาพจะเป็นสิ่งที่ดีเช่นกัน คอมไพเลอร์ C ++ มีการเพิ่มประสิทธิภาพนี้หรือไม่? ทำไม? ทำไมจะไม่ล่ะ? ฉันจะบอกให้คอมไพเลอร์ทำอย่างไร สำหรับ MSVC: /O2หรือ/Ox สำหรับ GCC: -O2หรือ-O3 วิธีการตรวจสอบว่าคอมไพเลอร์ได้ทำในกรณีที่แน่นอนหรือไม่ สำหรับ MSVC ให้เปิดใช้งานเอาต์พุต PDB เพื่อให้สามารถติดตามรหัสจากนั้นตรวจสอบรหัส สำหรับ GCC .. ฉันยังคงแนะนำวิธีการตรวจสอบว่าฟังก์ชั่นบางอย่างได้รับการปรับให้เหมาะสมเช่นนี้โดยคอมไพเลอร์ (แม้ว่าฉันจะพบว่ามันมั่นใจว่า Konrad บอกให้ฉันสมมติมัน) มันเป็นไปได้เสมอที่จะตรวจสอบว่าคอมไพเลอร์ทำสิ่งนี้ด้วยการเรียกซ้ำแบบไม่สิ้นสุดและตรวจสอบว่ามันส่งผลให้เกิดการวนซ้ำไม่สิ้นสุดหรือสแต็กล้น (ฉันทำสิ่งนี้กับ GCC และพบว่า-O2เพียงพอ) แต่ฉันต้องการ สามารถตรวจสอบฟังก์ชั่นบางอย่างที่ฉันรู้ว่าจะยุติได้ ฉันชอบที่จะมีวิธีง่ายๆในการตรวจสอบเรื่องนี้ :) หลังจากการทดสอบบางอย่างฉันพบว่า destructors ทำลายความเป็นไปได้ของการเพิ่มประสิทธิภาพนี้ บางครั้งมันก็คุ้มค่าที่จะเปลี่ยนการกำหนดขอบเขตของตัวแปรและเทมเพลตบางอย่างเพื่อให้แน่ใจว่าพวกเขาออกนอกขอบเขตก่อนที่แถลงผลตอบแทนจะเริ่มต้น หาก destructor ใด ๆ …

18
เป็นวิธีที่ดีในการ NULL ตัวชี้หลังจากลบหรือไม่
ฉันจะเริ่มต้นด้วยการพูด ใช้ตัวชี้สมาร์ทและคุณจะไม่ต้องกังวลเกี่ยวกับเรื่องนี้ รหัสต่อไปนี้มีปัญหาอะไร? Foo * p = new Foo; // (use p) delete p; p = NULL; นี่เป็นจุดประกายโดยคำตอบและแสดงความคิดเห็นต่อคำถามอื่น หนึ่งความคิดเห็นจากNeil Butterworthสร้าง upvotes ไม่กี่: การตั้งค่าพอยน์เตอร์เป็น NULL หลังการลบไม่ใช่แนวปฏิบัติสากลที่ดีใน C ++ มีหลายครั้งที่มันเป็นเรื่องดีที่ต้องทำและบางครั้งเมื่อมันไม่มีจุดหมายและสามารถซ่อนข้อผิดพลาดได้ มีสถานการณ์มากมายที่ไม่สามารถช่วยได้ แต่จากประสบการณ์ของฉันมันไม่สามารถทำร้ายได้ ใครบางคนสอนฉัน

24
ฉันจะต่อหลาย C ++ สตริงในหนึ่งบรรทัดได้อย่างไร
C # มีคุณสมบัติซินแท็กซ์ซึ่งคุณสามารถต่อข้อมูลหลายชนิดเข้าด้วยกันใน 1 บรรทัด string s = new String(); s += "Hello world, " + myInt + niceToSeeYouString; s += someChar1 + interestingDecimal + someChar2; อะไรจะเทียบเท่าใน C ++ เท่าที่ฉันเห็นคุณจะต้องทำทุกอย่างแยกกันเพราะมันไม่รองรับสตริง / ตัวแปรหลายตัวด้วยเครื่องหมาย + ไม่เป็นไร แต่ดูไม่เรียบร้อย string s; s += "Hello world, " + "nice to see you, " + "or …

11
จะสร้างตัวเลขสุ่มใน C ++ ได้อย่างไร
ฉันพยายามสร้างเกมด้วยลูกเต๋าและฉันต้องมีตัวเลขสุ่มในนั้น (เพื่อจำลองด้านข้างของผู้ตายฉันรู้วิธีสร้างมันระหว่าง 1 ถึง 6) การใช้ #include <cstdlib> #include <ctime> #include <iostream> using namespace std; int main() { srand((unsigned)time(0)); int i; i = (rand()%6)+1; cout << i << "\n"; } ทำงานได้ไม่ดีนักเพราะเมื่อฉันรันโปรแกรมสองสามครั้งนี่คือผลลัพธ์ที่ฉันได้รับ: 6 1 1 1 1 1 2 2 2 2 5 2 ดังนั้นฉันต้องการคำสั่งที่จะสร้างตัวเลขสุ่มที่แตกต่างกันในแต่ละครั้งไม่เหมือนกัน 5 ครั้งในแถว มีคำสั่งที่จะทำเช่นนี้หรือไม่?
150 c++  random 

19
ทำไมประเภทมีขนาดที่แน่นอนเสมอไม่ว่าจะมีคุณค่าอย่างไร
การใช้งานอาจแตกต่างกันระหว่างขนาดที่แท้จริงของประเภท แต่โดยส่วนใหญ่ประเภทเช่น int ที่ไม่ได้ลงนามและ float จะมีขนาด 4 ไบต์เสมอ แต่ทำไมประเภทหนึ่งครอบครองหน่วยความจำจำนวนหนึ่งเสมอ ตัวอย่างเช่นถ้าฉันสร้างจำนวนเต็มต่อไปนี้ด้วยค่า 255 int myInt = 255; จากนั้นmyIntจะครอบครอง 4 ไบต์ด้วยคอมไพเลอร์ของฉัน อย่างไรก็ตามค่าจริง255สามารถแสดงด้วย 1 ไบต์เท่านั้นดังนั้นทำไมจะmyIntไม่ใช้หน่วยความจำ 1 ไบต์ หรือวิธีถามทั่วไปที่มากขึ้น: เหตุใดประเภทหนึ่งจึงมีขนาดเดียวที่เกี่ยวข้องเมื่อพื้นที่ที่ต้องการแสดงค่าอาจเล็กกว่าขนาดนั้น
149 c++ 

12
ทำไม x [0]! = x [0] [0]! = x [0] [0] [0]
ฉันกำลังศึกษา C ++ เพียงเล็กน้อยและฉันกำลังต่อสู้กับพอยน์เตอร์ ฉันเข้าใจว่าฉันสามารถมีพอยน์เตอร์ได้ 3 ระดับโดยการประกาศ: int *(*x)[5]; เพื่อให้*xเป็นตัวชี้ไปยังอาร์เรย์ของ 5 intองค์ประกอบที่เป็นตัวชี้ไปยัง นอกจากนี้ผมรู้ว่าx[0] = *(x+0);, x[1] = *(x+1)และอื่น ๆ .... ดังนั้นให้ประกาศข้างต้นเป็นเหตุผลว่าทำไมx[0] != x[0][0] != x[0][0][0]?
149 c++  c  arrays  pointers 

17
พอยน์เตอร์พอยน์คืออะไร?
ฉันไม่ได้พูดถึงพอยน์เตอร์ให้เป็นค่าคงที่ แต่เป็นพอยต์พอยต์ของตัวเอง ฉันกำลังเรียนรู้ C และ C ++ เกินกว่าสิ่งพื้นฐานมากและจนถึงวันนี้ฉันก็ตระหนักว่าตัวชี้ถูกส่งผ่านไปยังฟังก์ชั่นที่มีคุณค่า ซึ่งหมายความว่าภายในฟังก์ชั่นฉันสามารถทำให้ตัวชี้ที่คัดลอกไปยังค่าอื่น ๆ โดยไม่ส่งผลกระทบต่อตัวชี้ดั้งเดิมจากผู้โทร ดังนั้นประเด็นของการมีส่วนหัวของฟังก์ชั่นที่บอกว่า: void foo(int* const ptr); ภายในฟังก์ชั่นดังกล่าวคุณไม่สามารถกำหนดจุด ptr เป็นอย่างอื่นได้เนื่องจากเป็นค่าคงที่และคุณไม่ต้องการให้แก้ไข แต่เป็นฟังก์ชันดังนี้: void foo(int* ptr); ทำงานได้ดีเช่นกัน! เนื่องจากตัวชี้ถูกคัดลอกแล้วและตัวชี้ในผู้โทรจะไม่ได้รับผลกระทบแม้ว่าคุณจะแก้ไขการคัดลอก ดังนั้นข้อดีของ const คืออะไร
149 c++  c  pointers  const 

2
`void_t` ทำงานอย่างไร
ผมเฝ้าดูการพูดคุยวอลเตอร์บราวน์ที่ Cppcon14 เกี่ยวกับการเขียนโปรแกรมแม่แบบที่ทันสมัย ( Part I , Part II ) ที่เขานำเสนอของเขาvoid_tเทคนิค SFINAE ตัวอย่าง: กำหนดเทมเพลตตัวแปรแบบง่ายที่ประเมินvoidว่าถ้าอาร์กิวเมนต์เท็มเพลตทั้งหมดมีรูปแบบที่ดี: template< class ... > using void_t = void; และลักษณะต่อไปนี้ที่ตรวจสอบการมีอยู่ของตัวแปรสมาชิกที่เรียกว่าสมาชิก : template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class …
149 c++  templates  c++14  sfinae 

2
C ++ semantics ของ `static const` เทียบกับ` const '
ใน C ++ โดยเฉพาะความแตกต่างระหว่าง semantic คืออะไร: static const int x = 0 ; และ const int x = 0 ; สำหรับstaticเป็นตัวเชื่อมโยงและตัวระบุคลาสหน่วยเก็บข้อมูล (เช่นภายในและภายนอกฟังก์ชัน)
149 c++ 

14
เหตุใดอาร์เรย์ของการอ้างอิงที่ผิดกฎหมาย
รหัสต่อไปนี้ไม่ได้รวบรวม int a = 1, b = 2, c = 3; int& arr[] = {a,b,c,8}; มาตรฐาน C ++ พูดถึงอะไรเกี่ยวกับเรื่องนี้ ฉันรู้ว่าฉันสามารถประกาศคลาสที่มีการอ้างอิงจากนั้นสร้างอาร์เรย์ของคลาสนั้นตามที่แสดงด้านล่าง แต่ฉันอยากรู้ว่าทำไมรหัสด้านบนไม่ได้รวบรวม struct cintref { cintref(const int & ref) : ref(ref) {} operator const int &() { return ref; } private: const int & ref; void operator=(const cintref &); }; int …
149 c++  arrays  reference 

8
แปลงโปรแกรม Python เป็นรหัส C / C ++ หรือไม่ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ เป็นไปได้ไหมที่จะแปลงโปรแกรม Python เป็น C / C ++ ฉันต้องใช้อัลกอริธึมสองสามอย่างและฉันไม่แน่ใจว่าช่องว่างของประสิทธิภาพนั้นใหญ่พอที่จะพิสูจน์ความเจ็บปวดทั้งหมดที่ฉันได้รับเมื่อทำใน C / C ++ (ซึ่งฉันไม่ค่อยเก่ง) ฉันคิดถึงการเขียนอัลกอริธึมง่ายๆและเปรียบเทียบกับโซลูชันที่แปลงแล้ว ถ้าอย่างเดียวนั้นเร็วกว่ารุ่น Python อย่างมากฉันจะไม่มีทางเลือกอื่นนอกจากทำใน C / C ++
149 c++  python  c  code-generation 

5
เหตุใดเครื่องมือเพิ่มประสิทธิภาพ GCC 6 ที่ปรับปรุงแล้วจึงใช้งาน C ++ ได้จริง
GCC 6 มีคุณลักษณะเครื่องมือเพิ่มประสิทธิภาพใหม่ : จะถือว่าthisไม่เป็นโมฆะและปรับให้เหมาะสมตามนั้น ตอนนี้การแพร่กระจายช่วงค่าถือว่าตัวชี้ของฟังก์ชันสมาชิก C ++ นี้ไม่ใช่ค่าว่าง กำจัดนี้ null ร่วมกันตรวจสอบตัวชี้แต่ยังแบ่งบางส่วนไม่สอดคล้องรหัสฐาน (เช่น Qt-5, โครเมี่ยม, KDevelop) สามารถใช้การแก้ไขชั่วคราว -fno-delete-null-pointer-checks ชั่วคราวได้ รหัสที่ไม่ถูกต้องสามารถระบุได้โดยใช้ -fsanitize = undefined เอกสารการเปลี่ยนแปลงเรียกสิ่งนี้ว่าเป็นอันตรายอย่างชัดเจนเพราะแบ่งรหัสที่ใช้บ่อยเป็นจำนวนมากอย่างน่าประหลาดใจ เหตุใดสมมติฐานใหม่นี้จึงไม่ใช้งานรหัส C ++ ที่ใช้งานได้จริง มีรูปแบบเฉพาะหรือไม่ที่โปรแกรมเมอร์ไม่ประมาทหรือไม่มีข้อมูลจะพึ่งพาพฤติกรรมที่ไม่ได้กำหนดนี้หรือไม่? ฉันไม่สามารถจินตนาการได้ว่ามีใครเขียนif (this == NULL)เพราะมันแปลกประหลาดมาก

6
ทำไมฉันถึงต้อง std :: ย้าย std :: shared_ptr?
ฉันได้อ่านซอร์สโค้ดของ Clangแล้วและฉันพบข้อมูลโค้ดนี้: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } ทำไมฉันจะต้องการที่จะ?std::movestd::shared_ptr มีจุดใดที่ถ่ายโอนความเป็นเจ้าของในทรัพยากรที่ใช้ร่วมกันหรือไม่ ทำไมฉันจะไม่ทำเช่นนี้แทน? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

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