本文共 916 字,大约阅读时间需要 3 分钟。
之间的重要区别
class B {
public:
B(){}
int i;
int j;
};
和
class B {
public:
B() = default;
int i;
int j;
};
是 B() = default; 定义的默认构造函数被认为是 not-user defined . 这意味着在值初始化的情况下,如
B* pb = new B(); // use of () triggers value-initialization
完全没有使用构造函数的特殊类型的初始化将发生,对于内置类型,这将导致零初始化 . 如果是 B(){} ,则不会发生这种情况 . C标准n3337 § 8.5 / 7说
对类型为T的对象进行值初始化意味着: - 如果T是具有用户提供的构造函数(12.1)的(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化是错误的); - 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象是零初始化的,如果T的隐式声明的默认构造函数是非平凡的,则调用该构造函数 . - 如果T是数组类型,则每个元素都是值初始化的; - 否则,对象被零初始化 .
例如:
#include
class A {
public:
A(){}
int i;
int j;
};
class B {
public:
B() = default;
int i;
int j;
};
int main()
{
for( int i = 0; i < 100; ++i) {
A* pa = new A();
B* pb = new B();
std::cout << pa->i << "," << pa->j << std::endl;
std::cout << pb->i << "," << pb->j << std::endl;
delete pa;
delete pb;
}
return 0;
}
可能的结果:
0,0
0,0
145084416,0
0,0
145084432,0
0,0
145084416,0
//...
转载地址:https://blog.csdn.net/weixin_35901163/article/details/114863476 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!