【问题标题】:Static class property, multiple constructors in C++静态类属性,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..?

标签: c++ class c++11 static


【解决方案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),则可以使用初始化程序对其进行初始化,其中每个表达式都是常量表达式,就在类内部定义”
    猜你喜欢
    • 2013-11-08
    • 2011-10-07
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2018-01-12
    相关资源
    最近更新 更多