主要的區別就是默認構造函數對內置類型的初始化上。如果沒有T中沒有定義構造函數,則對於“T t”,並不會對 t 中內置類型設置初始值,是一個隨機值。但對於“T t = T()”,對 t 中內置類型會設置初始值,如 int 類型會設置爲0。而對於自定義類型,不管哪種方式,都會調用構造函數初始化。
#include <iostream>
using namespace std;
class Inside {
public:
int getMem() { return _mem; }
private:
int _mem;
};
class Outside {
public:
int getMem() { return _mem; }
void printInside() {
cout << _in.getMem() << endl;
}
private:
int _mem;
Inside _in;
};
int main() {
Outside o1;
Outside o2 = Outside();
cout << o1.getMem() << " " << o2.getMem() << endl;
o1.printInside();
o2.printInside();
return 0;
}
上面代碼的輸出爲:
4196848 0
0
0
可見只有o1的內置類型成員沒有被初始化爲0。但此時如果對Outside類添加了一個空函數體的構造函數,可以得到結果如下:
4196864 1044243872
0
32767
o2 的內置類型成員及其成員變量 _in 的內置類型都沒有被初始化,因爲這個時候Outside的構造函數爲空,也就不會調用 _in 的構造函數初始化了,所以都是隨機數。
不過比較奇怪的是 o1 的 _in 的內置類型還是被初始化爲 0 了,這個需要自己再深入瞭解下了。