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() 调用的是系统默认的无参构造函数(它本身就具有初始化作用)时,有初始化作用,若调用了显式的无参构造函数,则会覆盖系统默认的无参构造函数,不进行初始化

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