【问题标题】:C++: Initialization of member variablesC++:成员变量的初始化
【发布时间】:2012-08-23 14:30:24
【问题描述】:

我对类成员变量初始化有一个困惑。

假设在我的 .h 文件中是:

class Test {

int int_var_1;
float float_var_2;

public:
       Test();
}

我的 .cpp 将是:

Test::Test() : int_var_1(100), float_var_2(1.5f) {}

现在当我实例化一个类时,变量被初始化为 100 和 1.5。

但如果这就是我在构造函数中所做的全部,我可以在我的 .cpp 中执行以下操作:

int Test::int_var_1 = 100;
float Test::float_var_2 = 1.5f;

我对在构造函数中初始化变量或使用解析运算符之间的区别感到困惑。

这种用作用域解析在构造函数之外初始化变量的方法是否只适用于静态变量,还是有一种方法也可以用于普通变量?

【问题讨论】:

  • 第二种方法不起作用,因为没有实例,这些是实例变量——它们需要一个实例。与 C++11 类内初始化 (class C {int i = 5;}) 相比,这实际上只填充了 5,否则会发生初始化。它实际上并没有更早地初始化任何东西。

标签: c++ constructor initialization


【解决方案1】:

在初始化非静态const 变量时(在构造函数中),您应该使用第一种方法。这是您可以修改这些类型的成员变量的唯一方法(除非您使用的是 C++11)。

静态成员变量可以通过使用适当的范围解析运算符(在类之外)来初始化。

【讨论】:

  • 现在不是每个人都在使用 C++11 - 毕竟没有基于范围的 for 循环谁可以生活???抛开幽默不谈——实际上我确实喜欢新的 for 循环——我认为按照最新标准进行教学很重要。尤其是在提高易用性方面投入了大量工作的情况下。我们都应该尽可能努力地推动 C++11,否则 C# 将获得更多的优势,我们 C++ 程序员将开始朝着 Perl 用户的方向前进,后 Python。我也非常喜欢 Perl!!!
  • @GemmanAster 不,尤其是对于由于各种原因无法使用 C++11 的旧版 SDK。
  • 你说得很好——但这些情况仍必须被视为“边缘情况”。 C++11 确实为该语言带来了很多积极的东西,同时也消除了一些我真的想不出不采用它的好理由——除非你说 SDK 中存在一个缺点非常具体的平台。
【解决方案2】:

你不能用一个代替另一个。如果成员变量不是静态的,则必须使用初始化列表(或构造函数体,但初始化列表更适合)*。如果成员变量是静态的,那么您必须在定义中使用第二个块中的语法对其进行初始化。

* Als 正确地指出,在 C++11 中,您还可以在声明中为非静态成员变量提供初始化器:

class test {
   int data = 5;
};

data(5) 隐式添加到未明确提及 data 的任何初始化列表中(包括隐式定义的默认构造函数)

【讨论】:

  • C++11 允许对静态成员进行就地初始化(C++11 §9.4.2.3)
  • @Als:C++11 允许就地初始化 non-static 成员,语法与第二个示例不同,而是在成员的声明。
  • 确实,它的 non-static 成员而不是 static 成员,只是想为了完整性添加它。
  • @Als:顺便说一句,您提供的参考是针对我没有提到的另一种情况:static const 整数类型的成员或constexpr 文字类型的静态变量也可以初始化在类声明中:struct S { static const int i = 10; };(尽管如果变量是 odr-used 则仍需要定义。在答案中注明 non-static 情况。
  • @madu:确切的规则并不是那么简单,在 C++11 中它们变得更加复杂。在类定义中,您可以为非静态成员函数(仅限 C++11)或整数类型的 static const 变量(C++03)或文字类型的 constexpr(C++11)提供值:struct test { int a = 5; int b; test() : b(10) {} static const int k = 15; static constexpr double d = 10.5; static int s; }; int test::s = 20;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2023-04-02
相关资源
最近更新 更多