Effective C++ - 条款2 - in-class初值设定问题

pre

针对Effective C++ (55条)中的每一个条款写一个blog。

0x02 尽量以const, enum, inline 替换 #define

为什么需要这样做?因为使用define会使得变量被define的符号替换,在遇到错误时提示的是替换后的符号而非原始定义的符号,引起误解,因此应使用const替换。而如果是在类的作用域中,为了保持只有一份该数据,要声明为static。因此就要考虑static+const。

前置知识

  1. const成员变量的初始化必须通过初始化列表实现
  2. static成员变量在类内声明,在类外初始化。(因为static成员不属于对象,属于类,为了保持仅有一份的语义,这块内存应该在类外分配,而内存分配是在定义时完成的,因此类内static成员仅能声明,不能定义,即不能分配内存)
  3. static成员变量在类内声明时不要给初始值,以免老版本编译器不允许【in-class初值设定】问题。
  4. static成员在类外定义时不能加static关键字。

正确实现方法

  1. 如何做?
class GamePlayer {
private:
  enum {NumTurns = 5};
  int scores[NumTurns];
  ...
};
  1. 为什么?
    因为有时候需要在编译时知道const值,为了避免【in-class初值】问题,借用enum来实现。

其理论基础是,enum的数值可以被视为整数类型。而整数类型允许【in-class初值】

posted @ 2022-08-17 23:34  ijpq  阅读(45)  评论(0编辑  收藏  举报