将默认的默认构造函数初始化变量为零? 我将一个类更新为C ++ 14,并试图找出最简单的方法,以初始化所有实例变量为零。到目前为止,这就是我所拥有的: 类myclass { 民众: ...

问题描述 投票:0回答:3
将构造函数设置为

default

等同:
MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}

...还是我需要启动每个变量? (我在Visual Studio中都尝试过,无论哪种方式都可以获得零,但是我不确定这是否运气。)

我在没有方括号的情况下实施课程:
MyClass obj;

设置构造函数默认相当于:

c++ constructor c++14
3个回答
20
投票

没有。不是

线
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{}

4
投票
用户定义的默认构造函数如下,

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{};
)时,此默认构造函数将导致类成员的初始化值。

支持,

1
投票
在以下形式之一中具有默认构造函数:

MyClass
(请参阅有关默认构造函数的这两种形式的更多信息。)至于定义和初始化

MyClass() {}; MyClass() = default;

的对象,
MyClass
导致默认初始化,而

MyClass() {};在用牙套定义对象(MyClass() = default;

)。这是因为

MyClass obj{};

是一个用户定义的默认构造函数,带有空的初始化列表和一个空白,这将导致成员的默认初始化。另一方面,
MyClass() {};
导致编译器定义的默认构造函数,该构造器将在定义用括号的对象时正确地导致价值初始化。查看
here

甚至是如何出错。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.