||引言: 今天上課的時後老師提到:new開闢變量時,後面加 ( ) ,與不加 ( ) 的效果是一樣的。在驗證中發現了一些特殊的地方。
以下爲總結,求證過程在下方閱讀:
調用系統的默認無參構造函數時,可以實現創造變量時順便進行初始化!(請注意必須是 “系統默認”)
|| 後加括號的new,若調用了系統的默認無參構造函數,就可以實現創造變量時順便進行初始化**
|| 不加括號的new,只具有創造變量的功能不會進行初始化
【對於基本數據類型】
int main(){
int* p2 = new int;
int* p = new int();
cout <<"未添加括號" << *p2 << endl;
cout <<"添加括號後: "<< *p << endl;
return 0;
}
|| 由上面可見:對於基本數據類型,加括號的new,數據new確實可以在創建對象的同時把它初始化爲0
【對於自定義數據類型】 —> 含有無參構造函數的顯式聲明
class XXX{
public:
int a;
XXX(){cout << "調用後的a值爲:" << a <<endl; }
};
int main(){
XXX* p1 = new XXX;
XXX* p2 = new XXX();
return 0;
}
|| 由上面可見:對於有“無參構造函數“的自定義數據類型,無論加不加括號的new,創建對象的同時都不會初始化
但是!當我們去掉“無參構造函數“後:
【對於自定義數據類型】 —> 不包含無參構造函數的顯式聲明
class XXX{
public:
int a;
// XXX(){cout << "調用後的a值爲:" << a <<endl; };
};
int main(){
XXX* p1 = new XXX;
XXX* p2 = new XXX();
cout << "不加括號後的a值爲:" << p1->a <<endl;
cout << "加括號後的a值爲: " << p2->a <<endl;
return 0;
}
|| 由上面可見:對於沒有顯式“無參構造函數“的自定義數據類型,加括號的new,確實可以在創建對象的同時把它初始化爲0 = = =》同基本數據類型
【分析】
type *p=new type 不同於 type *p=new type()
前者只具有創建對象(變量)的作用,後者在某些情況還具有初始化對象(變量)爲0的作用!
new type() 調用的是系統默認的無參構造函數(它本身就具有初始化作用)時,有初始化作用,若調用了顯式的無參構造函數,則會覆蓋系統默認的無參構造函數,不進行初始化