c/c++裏的new加括號與不加括號的區別

||引言: 今天上課的時後老師提到: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() 調用的是系統默認的無參構造函數(它本身就具有初始化作用)時,有初始化作用,若調用了顯式的無參構造函數,則會覆蓋系統默認的無參構造函數,不進行初始化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章