初始化类的静态非const数据成员
Initialize a static non-const data member of a class
我编写了以下示例代码:
class MyClass {
static int a;
public:
MyClass ( int i ) : a ( i ) {
cout << " n ctor called. a is : "<< a << " n";
}
};
int MyClass::a = 1;
int main( ) {
MyClass my(2);
}
我知道这会导致编译错误,因为静态数据成员不能在构造函数初始化列表中使用。
那么如何在每次创建类的对象时初始化静态数据成员呢?我希望从构造函数调用的静态成员函数可以做到这一点。这是唯一可能的办法吗?
简单,在构造函数体中为a
赋值:
MyClass ( int i ) {
a = i;
cout << " n ctor called. a is : "<< a << " n";
}
您不能使用初始化列表来这样做,因为a
没有被初始化,它只是被分配给一个新值。在调用构造函数之前,在程序开始时,a
将初始化为值0(未初始化的static
变量设置为0)。
这是编译器告诉你的,相当直接:
error: ' int MyClass::a '是静态数据成员;它只能在定义
处初始化
看起来有点傻,你确定它应该是static
,而不是一个实例变量?在整个程序中,只有一个static
变量的实例,它的生命周期从程序开始执行到程序结束。
EDIT:似乎你确实意识到只有一个static
变量的实例,通过你的一个评论的外观。只需注意初始化和赋值是两件不同的事情。
关键字static声明成员变量在每个类实例中将不具有自己的值,而是使用您编写的代码行初始化的一个值:
int MyClass::a = 1;
构造函数的目标是初始化实例,但是静态变量成员与实例没有关系,因此不能在初始化列表中初始化它们,而初始化列表用于初始化非静态成员。如果你给变量赋的值不在构造函数的初始化列表中,你只需替换变量的值,因为它是静态的。
您应该在这里阅读更多信息:http://www.bogotobogo.com/cplusplus/statics.php
静态成员变量对于类的所有实例应该保持相同。如果您想在构造函数中更改它,请使用普通成员变量。
但是回答你的问题:是的,你可以调用一个静态成员函数来设置变量。或者只在函数体中设置它,而不是在初始化列表中。
How to initialize the static data member each time an object of the class is created?
你不能这么做。静态数据成员不是类的对象/实例的一部分,而是独立的对象,只创建和初始化一次,通常是在程序启动时。在创建一个新的类实例时,你能做的是给它赋一个新的值。(但问题是为什么要这样做——使用应该是实例特定的非静态成员;静态成员在类的所有实例之间共享。
非const静态int成员必须在文件作用域中定义,这是您可以显式初始化它的地方,就像您在示例中所做的那样。如果您省略了初始化器(1
),您的变量,因为它具有静态持续时间,将由编译器使用0
初始化。
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 静态const数据成员在另一个文件中定义
- 使用const变量时,非静态数据成员的使用无效
- 在构造函数中从 std::istream 初始化 const 类数据成员
- 返回指向 const 数据成员和 'auto' 关键字的 const 指针。有点困惑
- 参考数据会在const函数中更改另一个数据成员
- C++:如何将数据成员定义为 const
- 错误:非整型 'const char[]' 的静态数据成员的类内初始化无效
- 仅授予派生类对基类数据成员/函数的 const 访问权限
- 用于具有const数据成员的类的move和右值赋值操作符
- 初始化类的静态const非整型数据成员
- 具有const数据成员作为类成员的对象
- 初始化类的静态非const数据成员
- 为什么没有为包含const数据成员的类提供默认构造函数
- 英特尔C++错误:"pair"不是非静态数据成员或类"std::pair<const int, double>"的基类
- const数据成员
- 不能在const成员函数中赋值给非静态数据成员
- c++数据成员.目标:在构造函数中初始化,然后不管,将const工作在这里
- 什么名称查找规则适用于静态 const 数据成员定义中的名称
- 非静态const数据成员