初始化C ++变量的不同方法

时间:2014-06-12 19:29:59

标签: c++

我知道当你在类中声明变量时,它们应该在构造函数初始化列表中初始化。如果我不想这样做并在构造函数之外初始化它,那么语法Object obj = Object(parameter)是否有效?我不太了解以这种方式初始化它的机制。

3 个答案:

答案 0 :(得分:1)

C ++ 11 中,通过使用大括号或等于初始化程序,类内初始化程序成为可能:

struct A {
  A () { }
  A (int) : s2 ("stackoverflow") { }

  std::string s1 = "hello world";
  std::string s2 { "hello world" };
};

以上说明s1s2将使用指定的初始化程序进行初始化,除非它们在 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 将无法引用构造函数参数。