静态类属性,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++ 中的多个构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象下

如何在构造函数 C++ 中使用静态变量?

C++ 静态工厂构造函数

C ++中的静态构造函数?我需要初始化私有静态对象

父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???