C++:成员变量的初始化

标签 c++ constructor initialization

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

假设在我的 .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;

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

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

最佳答案

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

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

class test {
   int data = 5;
};

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

关于C++:成员变量的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170160/

相关文章:

c++ - 根据命令行输入返回仿函数

java - 构造函数调用是否也进入堆栈?

c++ - std::initializer_list 变体

.net - log4net 初始化

c++ - 如何将 4 个 float 的 ps vector 转换为 4 个 double 并存储到 pd 数组?

c++ - 重载 == 运算符以使用字符串比较来比较两个 char[]

c++ - 在函数中传递显式字符数组?

javascript - Stream.Transform 在 Node 中究竟是如何工作的?

java - Java 和 Hibernate 的继承 - 更新类型转换

c++ - 为什么C++不允许派生类在初始化列表中使用基类成员?