我知道当你在类中声明变量时,它们应该在构造函数初始化列表中初始化。如果我不想这样做并在构造函数之外初始化它,那么语法Object obj = Object(parameter)是否有效?我不太了解以这种方式初始化它的机制。
答案 0 :(得分:1)
在 C ++ 11 中,通过使用大括号或等于初始化程序,类内初始化程序成为可能:
struct A {
A () { }
A (int) : s2 ("stackoverflow") { }
std::string s1 = "hello world";
std::string s2 { "hello world" };
};
以上说明s1
和s2
将使用指定的初始化程序进行初始化,除非它们在 mem-initializer 中初始化被调用的构造函数。
注意:如果使用
A(int)
初始化 A , s1 将使用"hello world"
进行初始化和 s2 与"stackoverflow"
;如果调用默认构造函数, s1 和 s2 将使用它们的类内初始值设定项。
在 C ++ 11 之前,如果您不希望该成员隐式默认构造<,则必须使用 mem-initializer list / em>在某些任务之前(在ctor的主体中)。
struct A {
A () {
s1 = std::string ("hello world"); // copy-assignment
}
std::string s1;
};
答案 1 :(得分:0)
如果未在初始化列表中初始化它们,则所有对象都默认初始化(当然需要存在默认构造函数)。
然后为其分配另一个值的语法是:
obj = Object(params...);
适用于任何类型Object
。其中obj
是所述类的成员对象。
答案 2 :(得分:0)
C ++ 11为类成员添加了对 brace-or-equal-initializer 语法的支持。 brace-or-equal-initializer 用于任何不为该变量提供特定初始化的构造函数,包括编译器生成的默认构造函数(但不包括复制和移动构造函数)。
brace-and-equal-initializer 将无法引用构造函数参数。