• 尽量使用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

effective-c 条款2理解与思考的更多相关文章

  1. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  2. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

  3. 《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导

    条款2: 理解auto自己主动类型推导 假设你已经读过条款1关于模板类型推导的内容,那么你差点儿已经知道了关于auto类型推导的所有. 至于为什么auto类型推导就是模板类型推导仅仅有一个地方感到好奇 ...

  4. Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype

    条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...

  5. Effective C++ 条款44

    本节条款的标题是:将与參数无关的代码抽离templates 学习本节条款首先须要明确一件事情,那就是模板实例化的过程会不会反复? 我们来举个样例: #include<iostream> u ...

  6. 读书笔记 effective c++ Item 49 理解new-handler的行为

    1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常.很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做.你仍然会看到这种旧行为,但是我会把关于它的讨 ...

  7. Effective C++ 条款46

    本节条款:须要类型转换时请为模板定义非成员函数 这节知识是在条款24的基础上,讲述的有关非成员函数在模板类中(non-member function template)的作用. 我们先看一下条款24讲 ...

  8. ​游戏设计思考:对COK的理解和思考

    转自:http://www.gameres.com/804983.html 一.前言 发此文的起因是最近加入了一个游戏研究群,受到大家对游戏研究热情的感染,也想将自己对游戏的理解和感悟发出来和大家一起 ...

  9. Effective C++ 条款08:别让异常逃离析构函数

    1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...

  10. Effective C++ 条款 50:了解new和delete的合理替换时机

    (一) 为什么有人想要替换operator new 和 operator delete呢?三个常见的理由: (1)用来检測运用上的错误. (2)为了强化效果. (3)为了收集使用上的统计数据. (二) ...

随机推荐

  1. 《HelloGitHub》第 79 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  2. Linq--取group分组后的每组第一条数据

    Linq对指定字段分组并取每组第一个值 先排序后分组 目的:取每个RequestID组内的最大HistoryID的数据 //对RequestID进行分组降序排序,去每组的第一条数据 IList< ...

  3. JavaScript基础复盘补缺

    语法规范 JavaScript严格区分大小写,对空格.换行.缩进不敏感,建议语句结束加':' JavaScript 会忽略多个空格.您可以向脚本添加空格,以增强可读性. JavaScript 程序员倾 ...

  4. 虚拟机里网络连接的几种方式说明(桥接,NAT, 仅主机)

    虚拟机里网络连接类型的选择: 桥接:选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,相当于连接在同一交换机上. NAT:NAT模式就是虚拟机要联网得先通过宿主机才能和外面进行通信. 仅主机:虚拟 ...

  5. iptables介绍和基本使用

    iptables 防火墙是什么 防火墙好比一堵真的墙,能够隔绝些什么,保护些什么. 防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这 ...

  6. nginx 客户端返回499的错误码

    我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录 网络架 ...

  7. Python基础之函数:1、函数的介绍及名称空间

    目录 一.函数 1.什么是函数 2.函数的语法结构 3.函数的定义与调用 4.函数的分类 5.函数的返回值 6.函数的参数 二.函数参数 1.位置参数 2.默认参数 3.可变长参数 1.一个*号 2. ...

  8. Nginx负载均衡策略的介绍与调优

    工作中经常会用到nginx负载均衡这一块,下面对nginx负载均衡策略做个总结.本人在工作中最常用到的负载均衡策略是轮询策略. 在一般情况下,Web中间件最大的作用就是负责对请求进行分发,也就是我们常 ...

  9. 16.python中的回收机制

    python中的垃圾回收机制是以引用计数器为主,标记清除和分代回收为辅的 + 缓存机制 1.引用计数器 在python内部维护了一个名为refchain的环状双向链表,在python中创建的任何对象都 ...

  10. 【笔记】CF1607F Robot on the Board 2 及相关

    题目传送门 记忆化搜索 首先,这题 \(10000\) 组 \(2000\times 2000\) 的数据直接爆搜肯定会超时.想到,如果一个点的答案已经被更新过,之后走到这个点能再多走的点也就确定了, ...