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

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

5
สมาชิกชั้นอ้างอิง const ยืดอายุการใช้งานของชั่วคราวหรือไม่?
ทำไมสิ่งนี้: #include <string> #include <iostream> using namespace std; class Sandbox { public: Sandbox(const string& n) : member(n) {} const string& member; }; int main() { Sandbox sandbox(string("four")); cout << "The answer is: " << sandbox.member << endl; return 0; } ให้ผลลัพธ์จาก: คำตอบคือ: แทน: คำตอบคือ: สี่

13
ใน C ++ ฉันจะจ่ายเงินสำหรับสิ่งที่ฉันไม่กินหรือไม่
ลองพิจารณาตัวอย่าง hello world ต่อไปนี้ใน C และ C ++: main.c #include <stdio.h> int main() { printf("Hello world\n"); return 0; } main.cpp #include <iostream> int main() { std::cout<<"Hello world"<<std::endl; return 0; } เมื่อฉันรวบรวมใน godbolt เพื่อประกอบขนาดของรหัส C เพียง 9 บรรทัด ( gcc -O3): .LC0: .string "Hello world" main: sub rsp, 8 mov edi, …
170 c++  c 


5
ฉันจะรับที่อยู่ของวัตถุได้อย่างน่าเชื่อถือเมื่อโอเปอเรเตอร์ & มากเกินไปได้อย่างไร
พิจารณาโปรแกรมต่อไปนี้: struct ghost { // ghosts like to pretend that they don't exist ghost* operator&() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &clyde; // darn; that's not clyde's address :'( } ฉันจะได้รับclydeที่อยู่ของได้อย่างไร ฉันกำลังมองหาทางออกที่จะทำงานได้ดีกับวัตถุทุกประเภท โซลูชัน C ++ 03 ก็ดี แต่ฉันก็สนใจ C ++ 11 …

6
C ++ 11, 14, 17 หรือ 20 มีค่าคงที่มาตรฐานสำหรับ pi หรือไม่?
มีปัญหาค่อนข้างโง่กับหมายเลข pi ใน C และ C ++ เท่าที่ฉันรู้M_PIกำหนดไว้math.hไม่จำเป็นต้องมีมาตรฐาน มาตรฐาน C ++ ใหม่แนะนำคณิตศาสตร์ที่ซับซ้อนจำนวนมากในไลบรารีมาตรฐาน - ฟังก์ชันไฮเพอร์โบลิกstd::hermiteและstd::cyl_bessel_iเครื่องกำเนิดเลขสุ่มที่แตกต่างกันเป็นต้น มาตรฐาน 'ใหม่' มีค่าคงที่สำหรับ pi หรือไม่? ถ้าไม่ - ทำไม คณิตศาสตร์ที่ซับซ้อนทั้งหมดนี้ทำงานอย่างไรหากปราศจากมัน? ฉันตระหนักถึงคำถามที่คล้ายกันเกี่ยวกับ pi ใน C ++ (เป็นเวลาหลายปีและมาตรฐานเก่า); ฉันต้องการทราบสถานะปัจจุบันของปัญหา ฉันสนใจด้วยเช่นกันว่าทำไมทำไม C ++ ถึงไม่มีค่าคงที่ pi แต่มีคณิตศาสตร์ที่ซับซ้อนกว่าเยอะ UPD: ฉันรู้ว่าฉันสามารถกำหนด pi ตัวเองเป็น 4 * atan (1) หรือ acos (1) หรือ double pi …

15
โมฆะหมายถึงอะไรใน C, C ++ และ C #
การมองหาพื้นฐานที่คำว่า " โมฆะ " มาจากไหนและทำไมจึงเรียกว่าโมฆะ จุดประสงค์ของคำถามคือช่วยคนที่ไม่มีประสบการณ์เกี่ยวกับ C และจู่ๆก็มองไปที่ codebase บนพื้นฐานของ C

8
การแยกรหัสชั้นเรียนออกเป็นส่วนหัวและไฟล์ cpp
ฉันสับสนเกี่ยวกับวิธีการแยกการใช้งานและรหัสการประกาศของคลาสแบบง่ายเป็นส่วนหัวและไฟล์ cpp ใหม่ ตัวอย่างเช่นฉันจะแยกรหัสสำหรับคลาสต่อไปนี้ได้อย่างไร class A2DD { private: int gx; int gy; public: A2DD(int x,int y) { gx = x; gy = y; } int getSum() { return gx + gy; } };
170 c++  oop  class 

9
เหตุใดแนวคิดทั้งสองแตกต่างกันจึงเรียกว่า "ฮีป"
เหตุใดฮีปแบบรันไทม์จึงใช้สำหรับการจัดสรรหน่วยความจำแบบไดนามิกในภาษา C และโครงสร้างข้อมูลซึ่งทั้งสองเรียกว่า "ฮีป" มีความสัมพันธ์บ้างไหม?

4
ฉันควรเพิ่มไฟล์. vcxproj.filter ไปยังตัวควบคุมแหล่งที่มาหรือไม่
ขณะประเมิน Visual Studio 2010 Beta 2 ฉันเห็นว่าในไดเรกทอรีที่แปลงไฟล์vcprojของฉันกลายเป็นไฟล์vcxproj นอกจากนี้ยังมีไฟล์vcxproj.filterข้างแต่ละโครงการซึ่งดูเหมือนจะมีคำอธิบายของโครงสร้างโฟลเดอร์ (\ Source Files, \ Header Files ฯลฯ ) คุณคิดว่าไฟล์ตัวกรองเหล่านี้ควรได้รับการเก็บไว้ต่อผู้ใช้หรือไม่หรือควรใช้ร่วมกันในกลุ่ม dev ทั้งหมดและตรวจสอบใน SCC หรือไม่ ความคิดปัจจุบันของฉันคือการตรวจสอบพวกเขา แต่ฉันสงสัยว่ามีเหตุผลใดที่จะไม่ทำเช่นนั้นหรืออาจเป็นเหตุผลที่ดีว่าทำไมฉันควรตรวจสอบพวกเขาอย่างแน่นอน ประโยชน์ที่ชัดเจนคือโครงสร้างโฟลเดอร์จะตรงกันถ้าฉันดูที่เครื่องของคนอื่น แต่พวกเขาอาจต้องการจัดระเบียบใหม่อย่างมีเหตุผล

1
วิธีที่รวดเร็วในการปัด double เป็น 32-bit int อธิบาย
เมื่ออ่านLua ของรหัสที่มาผมสังเกตเห็นว่า Lua ใช้macroในการออกรอบdoubleกับ int32 ฉันดึงข้อมูลmacroและดูเหมือนว่า: union i_cast {double d; int i[2]}; #define double2int(i, d, t) \ {volatile union i_cast u; u.d = (d) + 6755399441055744.0; \ (i) = (t)u.i[ENDIANLOC];} ที่นี่ENDIANLOCถูกกำหนดให้เป็นendianness , 0สำหรับ endian เล็ก ๆ น้อย ๆ1สำหรับ endian ใหญ่ Lua จัดการกับ endianness อย่างระมัดระวัง tย่อมาจากชนิดจำนวนเต็มเช่นหรือintunsigned int ฉันทำวิจัยเล็กน้อยและมีรูปแบบที่ง่ายกว่าmacroซึ่งใช้ความคิดเดียวกัน: #define double2int(i, d) …


2
ฟังก์ชั่นการแลกเปลี่ยนเพื่อนสาธารณะ
ในคำตอบที่สวยงามของcopy-and-swap-idiomมีโค้ดบางส่วนที่ฉันต้องการความช่วยเหลือเล็กน้อย: class dumb_array { public: // ... friend void swap(dumb_array& first, dumb_array& second) // nothrow { using std::swap; swap(first.mSize, second.mSize); swap(first.mArray, second.mArray); } // ... }; และเขาเพิ่มบันทึก มีการอ้างสิทธิ์อื่น ๆ ที่เราควรชำนาญ std :: swap สำหรับประเภทของเราให้การแลกเปลี่ยนในชั้นเรียนพร้อมการแลกเปลี่ยนฟังก์ชั่นฟรีเป็นต้น แต่สิ่งนี้ไม่จำเป็นทั้งหมด: การใช้ swap ที่เหมาะสมจะต้องผ่านการโทรที่ไม่มีเงื่อนไข และฟังก์ชั่นของเราจะพบผ่าน ADL ฟังก์ชั่นหนึ่งจะทำ เนื่องจากfriendฉันใช้คำศัพท์ที่ "ไม่เป็นมิตร" ฉันต้องยอมรับ ดังนั้นคำถามหลักของฉันคือ: ดูเหมือนว่าฟังก์ชั่นฟรีแต่ภายในร่างกายของคลาส? ไม่ได้เป็นเหตุผลนี้swapคง ? เห็นได้ชัดว่ามันไม่ได้ใช้ตัวแปรสมาชิกใด ๆ …

6
การใช้วัตถุมาตรฐานทั่วไป :: ฟังก์ชั่นที่มีฟังก์ชั่นสมาชิกในชั้นหนึ่ง
สำหรับคลาสหนึ่งฉันต้องการเก็บพอยน์เตอร์ของฟังก์ชั่นบางส่วนไว้ในฟังก์ชั่นสมาชิกของคลาสเดียวกันในวัตถุที่mapเก็บหนึ่งstd::functionอัน แต่ฉันล้มเหลวในตอนแรกด้วยรหัสนี้: class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } }; ฉันจะได้รับerror C2064: term does not evaluate to a function taking 0 argumentsในการxxcallobjรวมกับข้อผิดพลาดบาง instantiation แม่แบบแปลก ๆ ขณะนี้ฉันกำลังทำงานกับ Windows 8 ด้วย Visual Studio 2010/2011 และใน Win 7 ด้วย VS10 ก็ล้มเหลวเช่นกัน ข้อผิดพลาดจะต้องขึ้นอยู่กับกฎ C …

3
“ = ค่าเริ่มต้น” แตกต่างจาก“ {}” สำหรับตัวสร้างและตัวทำลายเริ่มต้นอย่างไร
ฉันโพสต์สิ่งนี้เป็นคำถามเกี่ยวกับ destructors เท่านั้น แต่ตอนนี้ฉันเพิ่มการพิจารณาตัวสร้างเริ่มต้น นี่คือคำถามเดิม: ถ้าฉันต้องการให้ destructor ในชั้นเรียนของฉันเป็นเสมือน แต่อย่างอื่นเหมือนกับสิ่งที่คอมไพเลอร์จะสร้างฉันสามารถใช้=default: class Widget { public: virtual ~Widget() = default; }; แต่ดูเหมือนว่าฉันจะได้รับผลกระทบเดียวกันโดยพิมพ์น้อยลงโดยใช้คำจำกัดความที่ว่างเปล่า: class Widget { public: virtual ~Widget() {} }; มีวิธีใดบ้างที่คำจำกัดความทั้งสองนี้ทำงานต่างกัน? จากการตอบกลับที่โพสต์สำหรับคำถามนี้สถานการณ์ของ Constructor เริ่มต้นจะคล้ายกัน ระบุว่าไม่มีความแตกต่างในความหมายระหว่าง " =default" และ " {}" สำหรับ destructors มีความคล้ายคลึงกันเกือบไม่แตกต่างกันในความหมายระหว่างตัวเลือกเหล่านี้สำหรับตัวสร้างเริ่มต้นหรือไม่ นั่นคือสมมติว่าฉันต้องการสร้างประเภทที่วัตถุประเภทนั้นจะถูกสร้างขึ้นและถูกทำลายทำไมฉันอยากจะพูด Widget() = default; แทน Widget() {} ? ฉันขออภัยหากการขยายคำถามนี้หลังจากการโพสต์ต้นฉบับละเมิดกฎ SO …

9
แสดงลำดับชั้น #include สำหรับไฟล์ C ++ ใน Visual Studio
ปัญหา:ฉันมีโครงการ Visual C ++ ขนาดใหญ่ที่ฉันพยายามย้ายไปยัง Visual Studio 2010 มันเป็นการผสมผสานกันอย่างมากของสิ่งต่าง ๆ จากแหล่งที่มาที่หลากหลายและทุกวัย ฉันได้รับปัญหาเพราะสิ่งที่เป็นทั้งและwinsock.hwinsock2.h คำถาม:มีเครื่องมือและเทคนิคอะไรบ้างในการแสดง#includeลำดับชั้นสำหรับไฟล์ต้นฉบับ Visual Studio C ++ ฉันรู้เกี่ยวกับcl /Pการรับเอาต์พุตตัวประมวลผลล่วงหน้า แต่ไม่ได้แสดงอย่างชัดเจนว่าไฟล์ใดรวมไฟล์ใดบ้าง (และในกรณีนี้/Pผลลัพธ์คือ 376,932 บรรทัดยาว 8-) ในโลกที่สมบูรณ์แบบฉันต้องการแสดงผลแบบลำดับชั้นของไฟล์ที่มีไฟล์อื่นรวมถึงหมายเลขบรรทัดดังนั้นฉันสามารถข้ามไปยังแหล่งที่มา: source.cpp(1) windows.h(100) winsock.h some_other_thing.h(1234) winsock2.h

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