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

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值