ฉันต้องการทราบกฎสำหรับโครงสร้างที่เป็นศูนย์ (หรือคลาส) ที่ไม่มีตัวสร้างเริ่มต้นใน C ++
โดยเฉพาะอย่างยิ่ง ดูเหมือนว่าหากเก็บไว้ในสแต็ก (เช่น เป็นตัวแปรโลคัล) พวกมันจะไม่ได้เตรียมใช้งาน แต่หากจัดสรรบนฮีป พวกมันจะถูกเตรียมใช้งานเป็นศูนย์ (ทดสอบด้วย GCC 4.9.1) รับประกันว่าจะพกพาได้หรือไม่
โปรแกรมตัวอย่าง:
#include <iostream>
#include <map>
using namespace std;
struct X {
int i, j, k;
void show() { cout << i << " " << j << " " << k << endl; }
};
int fib(int i) {
return (i > 1) ? fib(i-1) + fib(i-2) : 1;
}
int main() {
map<int, X> m;
fib(10); // fills the stack with cruft
X x1; // local
X &x2 = m[1]; // heap-allocated within map
X *x3 = new X(); // explicitly heap-allocated
x1.show(); // --> outputs whatever was on the heap in those positions
x2.show(); // --> outputs 0 0 0
x3->show(); // --> outputs 0 0 0
return 0;
}
แก้ไข: ลบ "หรือฉันควรใช้ตัวสร้าง" ในส่วนที่เป็นตัวหนา เพราะสิ่งที่ทำให้ฉันถามคือฉันต้องการทราบว่ามันเป็นพฤติกรรมที่รับประกันหรือไม่ - เราทุกคนต่างเห็นพ้องต้องกันว่าโค้ดที่อ่านได้ดีกว่าเมื่อมีตัวสร้างที่ชัดเจน
new X()
จะเริ่มต้นX
ในขณะที่new X
จะไม่ (ในกรณีปัจจุบันที่X
เป็นผลรวม) - person Quentin   schedule 06.05.2015new X
) - person maja   schedule 06.05.2015new X()
ทำไมคุณถึงชอบnew X
? - person TartanLlama   schedule 06.05.2015X
มีการกำหนดค่าเริ่มต้น (เป็นศูนย์) หรือไม่ทำอะไรเลย (ตัวสร้างค่าเริ่มต้นเล็กน้อย) อย่างไรก็ตาม กฎการเริ่มต้นถือเป็นฝันร้าย ดังนั้นเพียงใช้ Constructor ที่ชัดเจนและจัดการกับมันให้เสร็จสิ้น... - person Quentin   schedule 06.05.2015X()
อยู่ ในกรณีนี้ คอมไพลเลอร์จะตีความX()
เป็นการเรียกใช้ฟังก์ชัน ในขณะที่new X
จะไม่คลุมเครือเสมอ - person maja   schedule 06.05.2015()
ไม่ได้ช่วยคุณจากความคลุมเครือนั้น! - person Lightness Races in Orbit   schedule 06.05.2015A* a = new A();
เทียบเท่ากับA* a = new A;
ใช่ไหม หากไม่มี Constructor ระบบจะใช้ค่าดีฟอลต์ ไม่สำคัญว่าคุณจะละเว้นวงเล็บเหลี่ยมหรือไม่ก็ตาม - person maja   schedule 06.05.2015()
จะช่วยหลีกเลี่ยงความคลุมเครือ ฉันแสดงให้เห็นด้วยตัวอย่างสดว่าไม่ได้เป็นเช่นนั้น - person Lightness Races in Orbit   schedule 06.05.2015