default
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
...还是我需要启动每个变量? (我在Visual Studio中都尝试过,无论哪种方式都可以获得零,但是我不确定这是否运气。)) 我在没有方括号的情况下实施课程:
MyClass obj;
设置构造函数默认相当于:
没有。不是
线MyClass() = default;
更类似于但并不完全等于:
MyClass() {}
在任何一种情况下,都使用
MyClass obj;
在默认成员初始化的默认成员的默认限制对象中进行recRAST。 nove,使用时的区别
MyClass obj{};
是,
obj
将用默认的默认构造函数将其零定为零,同时仍将使用默认的用户提供默认的默认构造函数。
update(感谢 @m7913d的评论):
使用默认默认构造函数,并且
具有成员的显式初始化器,
MyClass obj{};
将不会为具有显式初始化器的成员进行零定位。
struct MyClassMembers
{
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
};
struct MyClass : MyClassMembers
{
MyClass(): MyClassMembers{} {}
};
然后将使用
MyClass m;
来初始化成员。
值得澄清几点。对于成员的课程,如下
MyClassMembers{}
class MyClass {
public:
int var;
float* ptr;
double array[3];
MyStruct data;
unique_ptr<MyStruct> smart_ptr;
...
}
将导致成员变量的值初始化。如果成员变量是类类型,则其值初始化在某些条件下发生,如该链接中所述。
当定义带有或没有括号的对象(
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
或MyClass obj{};
)时,此默认构造函数将导致类成员的初始化值。
支持,
MyClass
(请参阅有关默认构造函数的这两种形式的更多信息。)至于定义和初始化MyClass() {};
MyClass() = default;
MyClass
导致默认初始化,而MyClass() {};
在用牙套定义对象(MyClass() = default;
MyClass obj{};
是一个用户定义的默认构造函数,带有空的初始化列表和一个空白,这将导致成员的默认初始化。另一方面,
MyClass() {};
导致编译器定义的默认构造函数,该构造器将在定义用括号的对象时正确地导致价值初始化。查看here甚至是如何出错。