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

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

4
วิธีโอเวอร์โหลด std :: swap ()
std::swap()ถูกใช้โดยคอนเทนเนอร์มาตรฐานจำนวนมาก (เช่นstd::listและstd::vector) ในระหว่างการเรียงลำดับและแม้กระทั่งการกำหนด แต่การนำ std ไปใช้swap()นั้นเป็นแบบทั่วไปและค่อนข้างไม่มีประสิทธิภาพสำหรับประเภทที่กำหนดเอง ดังนั้นประสิทธิภาพจะได้รับจากการโอเวอร์โหลดstd::swap()ด้วยการใช้งานเฉพาะประเภทที่กำหนดเอง แต่คุณจะใช้มันได้อย่างไรเพื่อให้ std container ใช้?

7
ผลลัพธ์ทศนิยมที่แตกต่างกันเมื่อเปิดใช้งานการเพิ่มประสิทธิภาพ - บั๊กคอมไพเลอร์?
โค้ดด้านล่างทำงานบน Visual Studio 2008 ที่มีและไม่มีการปรับให้เหมาะสม แต่ใช้ได้เฉพาะกับ g ++ โดยไม่มีการปรับให้เหมาะสม (O0) #include <cstdlib> #include <iostream> #include <cmath> double round(double v, double digit) { double pow = std::pow(10.0, digit); double t = v * pow; //std::cout << "t:" << t << std::endl; double r = std::floor(t + 0.5); //std::cout << "r:" << …
109 c++  optimization  g++  c++-faq 

4
ตัวเปรียบเทียบแบบโปร่งใสคืออะไร?
ใน C ++ 14 ดูเหมือนว่า Associative container จะเปลี่ยนไปจาก C ++ 11 - [Associative.reqmts] / 13 พูดว่า: แม่แบบฟังก์ชันสมาชิกfind, count, lower_bound, upper_boundและequal_rangeจะได้มีส่วนร่วมในการแก้ปัญหาเกินเว้นแต่ชนิดCompare::is_transparentที่มีอยู่ จุดประสงค์ของการสร้างตัวเปรียบเทียบ "โปร่งใส" คืออะไร? C ++ 14 ยังมีเทมเพลตไลบรารีเช่นนี้: template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; …
106 c++  c++14  c++-faq 

3
เหตุใด std :: getline () จึงข้ามอินพุตหลังจากการแยกรูปแบบ
ฉันมีโค้ดต่อไปนี้ที่แจ้งให้ผู้ใช้ทราบชื่อและสถานะ: #include <iostream> #include <string> int main() { std::string name; std::string state; if (std::cin >> name && std::getline(std::cin, state)) { std::cout << "Your name is " << name << " and you live in " << state; } } สิ่งที่ฉันพบคือชื่อถูกแยกออกมาสำเร็จแล้ว แต่ไม่ใช่สถานะ นี่คืออินพุตและเอาต์พุตผลลัพธ์: Input: "John" "New Hampshire" Output: "Your name is …
105 c++  input  iostream  istream  c++-faq 

3
เหตุใดโปรแกรมสไตล์“ Hello World” ที่เรียบง่ายจึงไม่คอมไพล์กับ Turbo C ++?
ฉันได้เริ่มเรียนรู้ C ++ สำหรับคลาสการเขียนโปรแกรมของฉันแล้ว ฉันได้ดาวน์โหลดโปรแกรม "Hello World" นี้: #include <iostream> using namespace std; int main() { cout << "Hello, World!"; return 0; } แต่ Turbo C ++ บ่นว่า: Error D:\HELLO.CPP 1: Unable to open include file 'IOSTREAM' Error D:\HELLO.CPP 2: Declaration syntax error Error D:\HELLO.CPP 6: Undefined symbol 'cout' มีอะไรผิดปกติกับโปรแกรมง่ายๆนี้? …
101 c++  turbo-c++  c++-faq 

4
คำตอบที่ถูกต้องสำหรับ cout << a ++ << a ;?
เมื่อเร็ว ๆ นี้ในการสัมภาษณ์มีคำถามประเภทวัตถุประสงค์ดังต่อไปนี้ int a = 0; cout &lt;&lt; a++ &lt;&lt; a; คำตอบ: ก. 10 ข. 01 ค. พฤติกรรมที่ไม่ได้กำหนด ฉันตอบตัวเลือก b คือเอาต์พุตจะเป็น "01" แต่ฉันต้องประหลาดใจในภายหลังฉันได้รับแจ้งจากผู้สัมภาษณ์ว่าคำตอบที่ถูกต้องคือตัวเลือก c: ไม่ได้กำหนด ตอนนี้ฉันรู้แนวคิดของลำดับจุดใน C ++ แล้ว พฤติกรรมไม่ได้กำหนดไว้สำหรับคำสั่งต่อไปนี้: int i = 0; i += i++ + i++; แต่ตามความเข้าใจของผมสำหรับคำสั่งcout &lt;&lt; a++ &lt;&lt; aที่ostream.operator&lt;&lt;()จะเรียกว่าเป็นครั้งที่สองครั้งแรกกับและต่อมาostream.operator&lt;&lt;(a++)ostream.operator&lt;&lt;(a) ฉันยังตรวจสอบผลลัพธ์บนคอมไพเลอร์ VS2010 และเอาต์พุตเป็น '01' ด้วย
98 c++  c++-faq 

17
พอยน์เตอร์ของฟังก์ชันคืออะไร?
ฉันมีปัญหาในการดูยูทิลิตี้ของตัวชี้ฟังก์ชัน ฉันเดาว่ามันอาจมีประโยชน์ในบางกรณี (มีอยู่จริง) แต่ฉันไม่สามารถนึกถึงกรณีที่ใช้ตัวชี้ฟังก์ชันได้ดีกว่าหรือหลีกเลี่ยงไม่ได้ คุณช่วยยกตัวอย่างการใช้ฟังก์ชันพอยน์เตอร์ (ใน C หรือ C ++) ให้ดีได้ไหม
96 c++  c  function  pointers  c++-faq 

16
แนวทางปฏิบัติที่ดีที่สุดสำหรับการดำเนินการกะวงกลม (หมุน) ใน C ++
ตัวดำเนินการกะซ้ายและขวา (&lt;&lt; และ &gt;&gt;) มีอยู่แล้วใน C ++ อย่างไรก็ตามฉันไม่พบว่าฉันสามารถดำเนินการกะแบบวงกลมหรือหมุนได้อย่างไร สามารถดำเนินการเช่น "หมุนซ้าย" และ "หมุนขวา" ได้อย่างไร? หมุนขวาสองครั้งที่นี่ Initial --&gt; 1000 0011 0100 0010 ควรส่งผลให้: Final --&gt; 1010 0000 1101 0000 ตัวอย่างจะเป็นประโยชน์ (หมายเหตุบรรณาธิการ: วิธีทั่วไปหลายอย่างในการแสดงการหมุนใน C ต้องทนทุกข์ทรมานจากพฤติกรรมที่ไม่ได้กำหนดหากจำนวนการหมุนเป็นศูนย์หรือรวบรวมมากกว่าคำสั่งเครื่องหมุนเพียงครั้งเดียวคำตอบของคำถามนี้ควรบันทึกแนวทางปฏิบัติที่ดีที่สุด)

2
ฟังก์ชันที่มีชื่อเดียวกัน แต่มีลายเซ็นต่างกันในคลาสที่ได้รับ
ฉันมีฟังก์ชันที่มีชื่อเดียวกัน แต่มีลายเซ็นต่างกันในคลาสพื้นฐานและคลาสที่ได้รับ เมื่อฉันพยายามใช้ฟังก์ชันของคลาสพื้นฐานในคลาสอื่นที่สืบทอดมาจากที่ได้รับมาฉันได้รับข้อผิดพลาด ดูรหัสต่อไปนี้: class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; }; class C : public B { public: void bar() { string s; foo(s); } }; ฉันได้รับข้อผิดพลาดต่อไปนี้จากคอมไพเลอร์ gcc: In member function `void C::bar()': no matching function for call …

2
วงเล็บเสริมจะมีผลเมื่อใดนอกเหนือจากลำดับความสำคัญของตัวดำเนินการ
วงเล็บใน C ++ ถูกใช้ในหลาย ๆ ที่เช่นในการเรียกใช้ฟังก์ชันและการจัดกลุ่มนิพจน์เพื่อแทนที่ลำดับความสำคัญของตัวดำเนินการ นอกเหนือจากวงเล็บเสริมที่ผิดกฎหมาย (เช่นรอบรายการอาร์กิวเมนต์การเรียกใช้ฟังก์ชัน) ทั่วไป - แต่ไม่ใช่กฎสัมบูรณ์ของ C ++ คือวงเล็บพิเศษจะไม่ทำร้าย : 5.1 นิพจน์หลัก [expr.prim] 5.1.1 ทั่วไป [expr.prim.general] 6 นิพจน์ในวงเล็บคือนิพจน์หลักที่มีชนิดและค่าเหมือนกันกับนิพจน์ที่แนบมา การมีอยู่ของวงเล็บจะไม่ส่งผลต่อนิพจน์ว่าเป็น lvalue หรือไม่ นิพจน์วงเล็บสามารถใช้ในบริบทเดียวกับที่สามารถใช้นิพจน์ที่แนบมาได้ทุกประการและมีความหมายเหมือนกันยกเว้นที่ระบุไว้เป็นอย่างอื่น คำถาม : ในบริบทใดที่วงเล็บเสริมเปลี่ยนความหมายของโปรแกรม C ++ นอกเหนือจากการแทนที่ลำดับความสำคัญของตัวดำเนินการพื้นฐาน หมายเหตุ : ฉันพิจารณาข้อ จำกัด ของไวยากรณ์ตัวชี้ถึงสมาชิกที่&amp;qualified-idไม่มีวงเล็บให้อยู่นอกขอบเขตเนื่องจากจำกัด ไวยากรณ์แทนที่จะอนุญาตให้สองไวยากรณ์ที่มีความหมายต่างกัน ในทำนองเดียวกันการใช้วงเล็บภายในนิยามมาโครของตัวประมวลผลล่วงหน้ายังป้องกันความสำคัญของตัวดำเนินการที่ไม่ต้องการ

3
กฎ“ as-if” คืออะไร?
ตามชื่อเรื่องว่า กฎ "as-if" คืออะไร? คำตอบทั่วไปที่เราจะได้รับคือ: กฎที่อนุญาตให้มีการแปลงรหัสใด ๆ และทั้งหมดที่ไม่เปลี่ยนแปลงพฤติกรรมที่สังเกตได้ของโปรแกรม ในบางครั้งเรามักจะได้รับพฤติกรรมจากการใช้งานบางอย่างซึ่งเป็นผลมาจากกฎนี้ ผิดหลายครั้ง. แล้วกฎนี้คืออะไรกันแน่ มาตรฐานไม่ได้กล่าวถึงกฎนี้อย่างชัดเจนว่าเป็นส่วนหรือย่อหน้าดังนั้นอะไรที่อยู่ภายใต้ขอบเขตของกฎนี้? สำหรับฉันแล้วดูเหมือนว่าเป็นพื้นที่สีเทาซึ่งไม่ได้กำหนดรายละเอียดโดยมาตรฐาน ใครสามารถอธิบายรายละเอียดที่อ้างถึงการอ้างอิงจากมาตรฐานได้อย่างละเอียด? หมายเหตุ: แท็กสิ่งนี้เป็น C และ C ++ ทั้งคู่เนื่องจากเกี่ยวข้องกับทั้งสองภาษา
90 c++  c  optimization  c++-faq  as-if 

5
การส่งพอยน์เตอร์ที่ใช้ร่วมกันเป็นอาร์กิวเมนต์
ถ้าฉันประกาศว่าวัตถุที่อยู่ในตัวชี้ที่ใช้ร่วมกัน: std::shared_ptr&lt;myClass&gt; myClassObject(new myClass()); จากนั้นฉันต้องการส่งต่อเป็นอาร์กิวเมนต์ให้กับวิธีการ: DoSomething(myClassObject); //the called method void DoSomething(std::shared_ptr&lt;myClass&gt; arg1) { arg1-&gt;someField = 4; } ข้างต้นเพียงแค่เพิ่มจำนวนการอ้างอิงของ shared_pt และทุกอย่างจะดี? หรือไม่ทิ้งตัวชี้ห้อย? คุณยังควรทำสิ่งนี้หรือไม่: DoSomething(myClassObject.Get()); void DoSomething(std::shared_ptr&lt;myClass&gt;* arg1) { (*arg1)-&gt;someField = 4; } ฉันคิดว่าวิธีที่ 2 อาจมีประสิทธิภาพมากกว่าเพราะต้องคัดลอกที่อยู่ 1 รายการเท่านั้น (ตรงข้ามกับตัวชี้อัจฉริยะทั้งหมด) แต่วิธีที่ 1 ดูเหมือนจะอ่านได้มากกว่าและฉันไม่คาดว่าจะมีการ จำกัด ประสิทธิภาพการทำงาน ฉันแค่อยากให้แน่ใจว่าไม่มีอะไรอันตรายเกี่ยวกับเรื่องนี้ ขอขอบคุณ.

1
คำแนะนำการหักเทมเพลตคืออะไรและเราควรใช้เมื่อใด
มาตรฐาน C ++ 17 แนะนำ "คำแนะนำการหักเทมเพลต" ฉันรวบรวมสิ่งเหล่านี้เกี่ยวกับการหักอาร์กิวเมนต์แม่แบบใหม่สำหรับตัวสร้างที่นำมาใช้ในมาตรฐานเวอร์ชันนี้ แต่ฉันยังไม่เห็นคำอธิบายง่ายๆสไตล์คำถามที่พบบ่อยว่าพวกเขาคืออะไรและมีไว้เพื่ออะไร คำแนะนำการหักเทมเพลตใน C ++ 17 คืออะไร? ทำไม (และเมื่อ) เราต้องการพวกเขา? ฉันจะประกาศได้อย่างไร?

2
gcc / g ++:“ ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”
g++ ทำให้ฉันมีข้อผิดพลาดของแบบฟอร์ม: foo.cc:&lt;line&gt;:&lt;column&gt;: fatal error: &lt;bar&gt;: No such file or directory compilation terminated. จะเหมือนกันเมื่อคอมไพล์โปรแกรม C ด้วยgcc. ทำไมถึงเป็นเช่นนั้น? โปรดทราบ:คำถามนี้ถูกถามหลายครั้งก่อนหน้านี้ แต่ทุกครั้งจะเฉพาะเจาะจงสำหรับสถานการณ์ของผู้ถาม จุดประสงค์ของคำถามนี้คือการมีคำถามที่ผู้อื่นสามารถปิดเป็นรายการที่ซ้ำกันได้ทุกครั้ง คำถามที่พบบ่อย
88 c++  c  gcc  g++  c++-faq 

3
Copy constructor และ = operator overload ใน C ++: เป็นฟังก์ชันทั่วไปที่เป็นไปได้หรือไม่?
ตั้งแต่ตัวสร้างสำเนา MyClass(const MyClass&amp;); และตัวดำเนินการ = โอเวอร์โหลด MyClass&amp; operator = (const MyClass&amp;); มีรหัสเดียวกันพารามิเตอร์เดียวกันและแตกต่างกันเพียงแค่ผลตอบแทนเป็นไปได้ไหมที่จะมีฟังก์ชันทั่วไปให้ทั้งคู่ใช้?

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