【问题标题】:Defining a static member定义静态成员
【发布时间】:2021-09-11 06:24:00
【问题描述】:

考虑以下代码:

#include <iostream >
using namespace std;

class A
{
private:
    int x;
public:
    A(int _x)  {  x = _x; }
    int get()  { return x; }
};

class B
{
    static A a;
public:
   static int get()
   {  return a.get(); }
};

A B::a(0);

int main(void)
{
    B b;
    cout << b.get();
    return 0;
}

我的书说:

如果不使用A B::a(0)这行代码,会出现编译错误,因为B中没有定义静态成员a。要修复错误,我们需要显式定义a

但是,我想将对象 a 初始化为 static A a(0);,但它给了我一个编译器错误。有人可以解释为什么我不能以我描述的方式初始化对象 a,以及为什么有必要像他们在书中给出的那样初始化它。

【问题讨论】:

  • 您是将static A a(0); 放在类定义的内部还是外部?为什么它可能是错误的变化取决于位置。
  • 旁注:你可以在static 成员中逃脱的东西是一个移动的目标。 C++ 标准的每个新版本都会放宽一些限制并添加更多功能。
  • @user4581301 我试图将静态 A a(0) 放在类定义中。你能告诉我为什么把它放在这里是错误的吗?

标签: c++ object oop static


【解决方案1】:

如果你想内联定义a,你需要inline它,这在C++17中是可能的:

class B {
    inline static A a{0};    // or   inline static A a = 0;
public:
    static int get() { return a.get(); }
};

Demo

【讨论】:

  • 购买为什么需要使用关键字内联?我也可以将它定义为内联静态 A(0) 而不是大括号吗?另外,其他 C++ 标准是否允许这样做?
  • @loveofprogramming "但为什么":基本上只是因为语言需要它。我不知道为什么。就是那样子。不,不是没有大括号。大括号或=。不,C++17 之前的标准不允许这样做。
  • @loveofprogramming eerorika 对类似问题的回答在某种程度上涉及“为什么”。
  • @user4581301 编译器可能会选择它在链接时找到的第一个定义,而标准可能会说它是 UB 有冲突的定义。我想inline 只是为了区分定义static 成员的两种方式,但我不知道将来如果两个成员都放弃对inline 的要求是否会有任何缺点函数和变量可以是inlinestatic 变量定义可能隐含为inline,就像在类定义中定义的函数隐含为inline
  • 同意,可以,但如果这很容易,静态初始化命令就不会如此惨败。
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2014-06-11
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多