new生成的动态对象初始化



①T *p =new T;

②T *p =new T();

这两类用法不同点的总结。

 

1.若T为类类型,且用户定义了构造函数,则用户必须定义了默认构造函数,否则不能使用1、2两式。这种情形下,两种形式的效果完全相同,都会调用这个用户定义了的默认构造函数来初始化内部成员变量,但是如果用户定义的默认构造函数并未对成员变量初始化,则这个时候成员变量值是未定义的

说明:当程序员自定义了默认构造函数,对象的初始化就由用户定义的默认构造函数负责。此时在类型后加空括号要求值初始化是不起作用的。

2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该类合成一个默认的构造函数,这个时候上述两种形式的结果就不同了,①类内部的成员变量这个时候执行默认初始化,其值是未定义的。但是在②中就不同了,加了括号后,成员变量会执行值初始化,即以0的形式进行初始化(整数就为0,bool就为false,string 就为空)

3.若T为内置类型,则①的形式中*p的值为未定义的,②中进行值初始化如上。

例:

int *pia = new int[10];    // 10个未初始化int
int *pia2 = new int[10](); // 10个值初始化为0的int


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值