• 尽量使用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. c++ 关于引用变量你不知道的东西

    引用变量延迟绑定 我们知道引用变量定义时要立刻赋值,告诉编译器他是谁的引用.如果不赋值,编译会失败. 如果引用变量是单个定义的,对他赋值还比较简单. struct test_T { int data; ...

  2. webpack优化项目

    在使用vue 构建项目的时候 ,会用到vue.js, vue-router.js, 等库,通常打包的话会将这些公用的代码打包的一个文件中,导致该文件过大影响加载的速度.那么可以考虑使用cdn 加速的方 ...

  3. 2022-11-03 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  4. python学习——查找计算机中的文件

    # import os # # path = 'C:/Users/admin/Desktop/images' # files = os.listdir(path) # # for f in files ...

  5. 自学 TypeScript 第二天 编译选项

    前言: 昨天我们学习了 TS 的数据类型,不知道大家回去以后练习没练习,如果你练习了一定会发现一个问题,我们的 TS 好像和 JS 不太一样 JS 写完之后直接就可以放到页面上,就可以用了,而我们的 ...

  6. js 评级五星设置

    <input type="text" class="tt" style="color:red;border-style:none"&g ...

  7. mysql-DuplicateUpdate和java的threadpool的"死锁"

    大家千万不要被文章的标题给迷惑了,他两在本篇文章是没有关系的, 今天给大家讲讲最近2个有意思的issue,分享一下我学到的 mysql DuplicateUpdate的用法要注意的点 java的thr ...

  8. uni 结合vuex 编写动态全局配置变量 this.baseurl

    在日常开发过程,相信大家有遇到过各种需求,而我,在这段事件便遇到了一个,需要通过用户界面配置动态接口,同时,因为是app小程序开发,所以接口中涉及到了http以及websocket两个类型的接口. 同 ...

  9. C++编程笔记(通信)(win32平台)

    目录 一.初始化网络库 二.socket套接字 2.1服务端 2.2客户端 三.发送.接收数据 3.1发送 3.2接收数据 四.自定义的结构体 4.1 发送端 4.2接收端 IPV6版本套接字的创建 ...

  10. java面试题-线程

    简述线程.程序.进程的基本概念.以及他们之间关系是什么? 系统运行程序到停止就是一个进程创建到消亡的过程,而线程则是进程的更小单位 线程有哪些基本状态? 初始,运行中,等待,阻塞,超时,终止1 关注公 ...