说我有
class A {
public:
A();
A(int);
static const int foo;
int bar;
}
如果要在构造函数中初始化静态成员,如何构造类?这个:
A::A()
{
foo = 123;
bar = 42;
}
A::A(int b)
{
foo = 123;
bar = b;
}
似乎可以正常工作,但是如果静态成员foo
在该类的所有实例之间共享,那么如何将其初始化两次呢?好像我做错了。
答案 0 :(得分:3)
好吧,是的,您做错了…
首先,应该在类声明中直接初始化静态const成员(因为某些注释中提到它是const
,所以可以,但“不需要”如此)。
但是通常来说,如果您有一个静态类成员,则可以像下面这样简单地提供一个初始化程序作为前向定义:
int A::foo = 42;
这允许编译器甚至在您的任何构造函数被调用之前初始化静态成员。 (这由标准C ++库为您处理)。
答案 1 :(得分:2)
如果您有一个非const
的静态成员,则可以在任意位置更改它,包括“在构造函数中”。这样做可能没有多大意义(尤其是在与给定类实例非常紧密耦合的构造函数中),但有可能。
如果静态成员为const
(如您的代码一样),则无法在任何地方进行更改。您只能初始化一次。您可以直接通过声明(const static int foo = 42
)或在相应的.cpp
文件(const int A::foo = 42
)中执行此操作。
答案 2 :(得分:1)
对于C ++ 11:
如果不能使用初始化器(其中每个表达式都是常量表达式)在类定义内部进行初始化,则必须在cpp文件的类外部定义静态变量:
file.h
class A {
public:
A();
A(int);
static const int foo;
int bar;
}
file.cpp
const int A::foo = 123;
对于C ++ 17:
这可以内联。
class A {
public:
A();
A(int);
inline static const int foo = 123;
int bar;
}