静态类属性,C++ 中的多个构造函数
Posted
技术标签:
【中文标题】静态类属性,C++ 中的多个构造函数【英文标题】:Static class property, multiple constructors in C++ 【发布时间】:2018-08-08 09:18:07 【问题描述】:说我有
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
在类的所有实例之间共享,我怎么可以将它初始化两次?好像我做错了什么。
【问题讨论】:
代码无法编译。此外,您将无法分配给foo
,因为它是const
-qualified。
区分初始化和赋值。
哎呀,A(bar);
是构造函数,当类被实例化为 int 作为参数时。
哪个版本的 C++? (11、14、17)?
IDK,它实际上是 arduino 嵌入式代码,它是 C++ 的子集,编译器选项包括 -std=gnu++11
所以我猜是 11..?
【参考方案1】:
嗯,是的,你做错了什么……
首先,静态 const 成员应该直接在类声明中初始化(因为它是 const
,正如某些 cmets 中提到的,它可以但不是“需要”)。
但一般来说,如果你有一个静态类成员,你可以简单地提供一个初始化器作为前向定义,如下所示:
int A::foo = 42;
这允许编译器在调用任何构造函数之前初始化静态成员。 (这是由标准 C++ 库为您处理的)。
【讨论】:
因为它是静态常量和整数,它也可以在类本身中初始化。无需单独定义。 因为是const
,所以可以在类声明中初始化,而不需要在类声明中初始化
【参考方案2】:
如果你有一个不是const
的静态成员,你可以在任何你喜欢的地方改变它,包括“在构造函数中”。这样做可能没有多大意义(尤其是在与给定类实例高度耦合的构造函数中),但这是可能的。
如果静态成员是const
(如您的代码中所示),则您无法在任何地方更改它。您只能初始化它(一次)。您可以直接使用声明 (const static int foo = 42
) 或在相应的 .cpp
文件 (const int A::foo = 42
) 中执行此操作。
【讨论】:
【参考方案3】:对于 C++11:
一个静态变量必须在你的 cpp 文件中的类之外定义,如果它不能用一个初始化器初始化,其中每个表达式都是一个常量表达式,就在类定义中:
文件.h
class A
public:
A();
A(int);
static const int foo;
int bar;
文件.cpp
const int A::foo = 123;
对于 C++17:
这可以内联完成。
class A
public:
A();
A(int);
inline static const int foo = 123;
int bar;
【讨论】:
我认为静态 const int 可以内联初始化,甚至在 C++11 之前。我错了吗? 内联代码在 C++03 中是否已经有效(至少对于整数类型)? 是的,这是真的,条件是:它可以用一个初始化器初始化,其中每个表达式都是一个常量表达式,就在类定义中(en.cppreference.com/w/cpp/language/static ) @john & Walter 根据 cppreference 的说法,是的! en.cppreference.com/w/cpp/language/static 在“常量静态成员”下:“如果将整数或枚举类型的静态数据成员声明为 const(而非 volatile),则可以使用初始化程序对其进行初始化,其中每个表达式都是常量表达式,就在类内部定义”以上是关于静态类属性,C++ 中的多个构造函数的主要内容,如果未能解决你的问题,请参考以下文章