【问题标题】:Class static type initialization类静态类型初始化
【发布时间】:2020-03-27 18:11:20
【问题描述】:

所以我有一个问题,在 c++11 中,为什么我必须指定静态成员的类型才能为其赋值?

例子:

class Player
{
   static size_t numOfObj;
public:
   Player(){numOfObj++;}
   ~Player(){numOfObj--;}
}

size_t Player::numOfObj = 0;

在这种情况下,为什么我必须再次指定 numOfObj 的类型为 size_t,因为它已经被声明,我不能只做 Player::numOfObj = 0; 吗?

提前致谢。

【问题讨论】:

  • @idclev463035818 更新
  • 请注意,在 C++17 中,您可以只在类中分配值,而无需重复。
  • @einpoklum 是的,我知道,但我只是想看看为什么在这种情况下我们必须这样做:)
  • @idclev463035818 是的,但它本身也是重复的。
  • 我清理了我的 cmets,是的,你可以回答你自己的问题,根据我的经验,自我回答的问题会有更高的标准,但原则上回答你自己的问题没有错问题

标签: c++


【解决方案1】:

size_t Player::numOfObj = 0; 是定义的语法。一个(非内联)静态变量必须在一个翻译单元中恰好定义一次。不多也不少(除非变量未使用)。

我不能只做 Player::numOfObj = 0;因为它已经被声明了?

你可以这样做。但不在命名空间范围内,因为那是表达式语句的语法。表达式语句可能不在命名空间范围内。它们只允许在块范围内。这个表达式的意思是变量的值被赋值。可以根据需要在任意多个翻译单元中多次分配分配(只要类型是非常量且可分配的)。

所以,如果定义有这种语法,就会与已经具有其他含义的语法发生冲突。那是不可取的。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2020-01-31
    • 2011-02-26
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多