在代码中时常会遇到两种new的形式
A* a = new A;//①
A* a = new A();//②
那么,这两者有何区别吗?
结论
先给出结论:
- 当A类无构造函数,有数据成员的情况下,有区别。①的数据成员为随机值,而②的数据成员会被初始化。
- 当A类有构造函数,有数据成员的情况下,无区别。数据成员都为随机值,因为此时,初始化由构造函数去执行。
- 如果A是空类,那么以上两种写法没有区别。
另外基本数据类型的情况如下:
int *a1 = new int;//初值随机
int *a2 = new int();//初值0
int *a3 = new int(100);//初值100
验证
环境:Clion 2022.1.1 + MinGW
这里声明了一个类A,里面有一个int型数据成员
class A
{
public:
// A() = default;
// A(){}
int m;
};
int main()
{
A* a = new A;
A* b = new A();
return 0;
}
一,无构造函数的情况下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCUISN2c-1653033154629)(C:\Users\Listening\AppData\Roaming\Typora\typora-user-images\image-20220520153121625.png)]](https://img-blog.csdnimg.cn/1e4dc3ddf0944dc19e15b2fef24bf124.png)
二,有构造函数的情况下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfDLCaWy-1653033154631)(C:\Users\Listening\AppData\Roaming\Typora\typora-user-images\image-20220520153840974.png)]](https://img-blog.csdnimg.cn/a14c0bf6485943bfaefb41b656324540.png)
注意:
A(){} 和A()=default 是不一样的!!!
=default 令编译器为某个类生成显式默认化的函数定义,简单来说,就是显式生成编译器默认的合成构造函数。这个和没有构造函数的情况(隐式)是一样的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiiC1xqP-1653033154632)(C:\Users\Listening\AppData\Roaming\Typora\typora-user-images\image-20220520154213057.png)]](https://img-blog.csdnimg.cn/926e32cd27b1491e91320915562d9897.png)
这里额外验证了一下,数据成员为类类型时的情况,也是和上述结论一致。
class A
{
public:
int m;
};
class B
{
A a;
};
int main()
{
B* b1 = new B;
B* b2 = new B();
return 0;
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rDZTfPxJ-1653033154632)(C:\Users\Listening\AppData\Roaming\Typora\typora-user-images\image-20220520154742259.png)]](https://img-blog.csdnimg.cn/fd553b911ba6472a98900a60eac1cd85.png) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrQTYrrP-1653033154633)(C:\Users\Listening\AppData\Roaming\Typora\typora-user-images\image-20220520154839483.png)]](https://img-blog.csdnimg.cn/86b2ae559e684c88b092fb0257736ff3.png)
C++ default
|