Я хотел бы знать правило обнуления структур (или классов), у которых нет конструктора по умолчанию в 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
либо инициализируется значением (обнуляется), либо ничего не делается (тривиальный конструктор по умолчанию). В любом случае, правила инициализации - это кошмар, так что просто используйте явный конструктор и покончим с этим... - 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;
, не так ли? Если конструктора нет, используется конструктор по умолчанию - неважно, опустили вы скобки или нет. - person maja   schedule 06.05.2015()
каким-то образом позволяет избежать двусмысленности; Я продемонстрировал на живом примере, что это не так. - person Lightness Races in Orbit   schedule 06.05.2015