effective-c 条款2理解与思考

  • 尽量使用const,enum,inline替换 #define
    因为,#define 替换发生在预处理阶段,编译器对这个替换内容就缺少了类型检测,并且不利于错误信息的查看

  • 编译器再声明数组时必须知道数组的大小,而不是使用一个变量,我便有了如下测试

  1. 枚举类型做数组大小(在类中做成员)
class GamePlayer { 
private: 
enum { NumTurns = 5 } ; 
int scores[NumTurns]; 
};

可行,编译器看到的

class GamePlayer
  {
    
    private: 
    enum 
    {
      NumTurns = static_cast<unsigned int>(5)
    };
    
    int scores[5];  //这里发生了替换
  };
  1. const类型做数组大小(在类中做成员)
class GamePlayer { 
private: 
const int NumTurns = 5;
int arr[NumTurns];   
//error: invalid use of non-static data member 'NumTurns'
//错误不会发生替换
};

将变量变为static时就可以通过编译了

class GamePlayer {
private: 
static const int NumTurns = 5;
int arr[NumTurns]; 
};

可行,编译器看到的

class GamePlayer
{
  private: 
  static const int NumTurns = 5;
  int arr[5];
};
  1. 枚举类型做数组大小(函数中)
void func()
{
enum { NumTurns = 5 } ; 
int scores[NumTurns]; 
} 

可行,编译器看到的

void func()
{
  enum 
  {
    NumTurns = static_cast<unsigned int>(5)
  };
  
  int scores[5];
}

当然类的成员函数中也是一样可行的

  1. const类型做数组大小(在函数中)
void func()
{
const int NumTurns =5;
int scores[NumTurns]; 
} 

可行,编译器看到的

void func()
{
  const int NumTurns = 5;
  int scores[5];
}

经过验证在类的成员函数中也是一样可行的

enum hack 的行为某方面说比较像#define 而不像 const, 有时候这正是你想要的。例如取一个 const的地址是合法的,但取一个 enurn 的地址就不合法,而取一个#define 的地址通常也不合法。

如果你不想让别人访问你的指针或引用所指向的某个整数常量,enum可以帮助实现。原因是对enum类型变量取地址是不合法的

  • 存在的问题
    enum hack 时模板元编程的基础技术 不能理解

  • 要记住
    对于单纯的常量,最好以const对象或emums替换#define
    对于宏函数,最好改用inline函数替换#define

posted @ 2023-01-23 13:02  satellite2002  阅读(32)  评论(0编辑  收藏  举报