||引言: 今天上课的时后老师提到: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() 调用的是系统默认的无参构造函数(它本身就具有初始化作用)时,有初始化作用,若调用了显式的无参构造函数,则会覆盖系统默认的无参构造函数,不进行初始化