经典阅读-《Effective C++》Item2:尽量以const,enum,inline替换#define


1. 宏定义

#define ASPECT_RATIO 1.653

该宏定义ASPECT_RATIO也许从来没有被编译器看到,也许在编译器开始处理源码之前就已经被预处理器替换了。所以记号名称ASPECT_RATIO有可能没进入符号表(symbol table)中。所以,当你从这个常量得到一个编译错误信息时,这个错误信息可能会提到1.653而不是ASPECT_RATIO,如果这个ASPECT_RATIO被定义在一个非你写的头文件中,那么调试追踪这个错误更是麻烦。在调试阶段,visual stiduo和linux平台的gdb在调试的过程中无法查找定义的宏的值,因为符号表中没有这个符号,因此不能所见即所得,还必须通过阅读代码才能看到。

2. 使用const定义常量

解决上面的问题的办法就是,以一个常量替换上面的宏

const double aspectRatio = 1.653;//大写名称通常用于宏,因此这里改变名称写法

从上面可以看出该常量有类型,double。它作为一个常量,肯定能被编译器看到,当然也就能进入符号表中了。

3. class专属常量

为了将常量的scope限制于class内,就必须让它成为class的一个成员;而为了确保此常量最多只有一份实体,必须让他让成为一个static成员。

class GamePlayer
{
private:
    static const int NumTurns = 5;//常量声明式
    int scores[NumTurns];//使用该常量
};

这里看到的是NumTurns的声明式而非定义式。通常C++要求对所使用的任何东西提供一个定义式,但如果它是个class专属常量又是static且为整数类型(integral type例如ints、chars、bools),则需要特殊处理。只要不取他们的地址,就可以声明并使用他们而无需提供定义式。如果要取某个class专属常量的地址,就必须提供这个专属常量的定义式:

const int GamePlayer::NumTurns;//NumTurns的定义

要把这个statement放进一个实现文件而非头文件,同时由于class常量在声明时获得了初值,定义时就不可以再设置初值了。
下面在举个例子说明用法:

/**
*    <effective C++>, page 14
*    const of calss
*    platform:    visual studio 2010, win32
*    filename:    item2_1cpp
*/
#include <iostream>
#include <stdlib.h>
using namespace std;

class MyTest
{
    //“MyTest::maxNumber1”: 只有静态常量整型数据成员才可以在类中初始化
    //int maxNumber1 = 5;

    //“MyTest::maxNumber1”: 只有静态常量整型数据成员才可以在类中初始化
    //const int maxNumber2 = 5;

    //“MyTest::maxNumber1”: 只有静态常量整型数据成员才可以在类中初始化
    //static int maxNumber3 = 5;

    static const int maxNumber4 = 5;
    static const char cconst = ‘A‘;
public:
    //“MyTest::maxNumber2”: 必须在构造函数基/成员初始值设定项列表中初始化
    //如果有const常量成员,一定要在构造函数的初始值设定项列表中初始化
    MyTest()
    {
        cout << "MyTest Constructor!" << endl;
        cout << "maxNumber4 = " << maxNumber4<< endl;
        cout << "cconst4 = " << cconst << endl;
    }

};

int main()
{
    MyTest obj;

    system("pause");
    return 0;
}

再来一个:

时间: 2024-10-20 08:00:41

经典阅读-《Effective C++》Item2:尽量以const,enum,inline替换#define的相关文章

Effective C++ Item 2 尽量以const, enum, inline 替换 #define

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 尽量以const, enum,inline 替换 #define --> 宁可以编译器替换预处理器 1.对于单纯常量,最好以const 对象或enum替换#define 不要用 #define ASPECT_RATIO 1.653 而用 const doube AspectRatio = 1.653 两个使用const的特殊情况 1.指向常量char *的字符串的常量指针 const ch

Book. Effective C++ item2-尽量使用const, enum, inline替换#define

##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATIO这个代号是能够被编译器加入到记号表(symbol table)里面,如果调试的时候,这个部分出现问题,能够很快的发现出来.但是很多时候我们的预处理器会把这个变量移除,只保留了一个1.653的常量,如果Debug的时候这个常量出现了错误,你是很难定位到自己需要修改代码的地方的,这就会造成我们在使用中

NO.2 尽量以const,enum,inline 替换 #define

1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性. 2.const XXX_XX,保证其常量性以及可控的作用域,如果是指针类型则 const XXXX* const ptr="hello world",也可以完美替换#defin 3.enum hack 替换数组大小问题,和#define 一样不会导致非必要内存(只有在声明enum类型时有内存) 4.宏函数会产生很多问题,没有对参数的各种限制,而inl

Effective C++ 条款2 尽量以const,enum,inline替换#define

1. 有些情况下,宁可以编译器替换预处理器,因为#define并不被视为语言的一部分从而导致某些问题. 2. 不带参数的宏展开引起的符号"丢失"问题. 例如,对于"#define ASPECT_RATIO 1.635",编译器在处理源代码之前ASPECT_RATIO就已经被替换为1.635,于是记号名称有可能没有进入记号表(symbol table)内.如果由于运用此常量而获得一个编译错误,错误信息可能会提到1.635而不是ASPECT_RATIO,追踪它将会浪费时

const,enum,inline替换#define

基本上使用预处理指令#define的地方都可以使用const,enum或者inline来替换掉它.主要的原因有两个: #define ASPECT_RATIO 1.653 1.预处理指令是在编译前就进行预处理的(gcc -E进行预处理,它的输出文件作为gcc -S进行编译的输入),所以编译器是看不到#define定义的符号ASPECT_RATIO ,故它不会出现在符号表中,这样如果编译期间出现了错误它可能只提示常量1.653,如果这个文件又不是你写的,那么调试会很困难. 2.使用常量可能比使用#

【02】以 const enum inline 代替 #define

1 // 2 // 2015-03-04 02/55 3 // 以 const enum inline 代替 #define 4 // 5 6 // 防止同一个物理文件被包含多次 7 #pragma once 8 9 // ---------------------------------- 10 // 1. 尽量使用 const 11 // ---------------------------------- 12 13 class foo 14 { 15 public: 16 foo();

条款2:尽量以const enum inline 来替换 #define

这里说的意思其实相当于,宁可以用编译器来替换预处理器 因为使用预处理器可能使得被处理过的东西无法进入符号表,例如 #define MAXLEN 16 这里的MAXLEN并没有进入符号表,这样有编译错误出现的时候,提示的都是16而并不是MAXLEN,这样就会带来很多的错误. 对于上面的那个式子,可以尝试的使用用一个常量去替换上面的宏:const int MAXLEN = 16 注意,常量的定义式往往被放在头文件中 应该要注意到的一点:class专属常量,为了将作用域限制在一个class内,应该让他

尽量多的以 const/enum/inline 替代 #define

前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这是因为 #define 机制只是简单的字符替换,这样一方面你无法对 #define 定义的东西加入一些C++语法元素,因此限制了面向对象编程语言的威力: 另一方面编译器不能获取到你所定义的变量类型/函数类型,因此无法提供全面的检测机制,导致隐藏 bug 增多. 所以要想出对 #define 机制进行

第一篇:尽量多的以 const/enum/inline 替代 #define

前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这是因为 #define 机制只是简单的字符替换,这样一方面你无法对 #define 定义的东西加入一些C++语法元素,因此限制了面向对象编程语言的威力: 另一方面编译器不能获取到你所定义的变量类型/函数类型,因此无法提供全面的检测机制,导致隐藏 bug 增多. 所以要想出对 #define 机制进行

条款1:尽量用const和inline而不用#define [effective C++ 学习笔记]

这一节主要讲得是,为什么const,inline要比#define好,总结起来如下: 1 如果使用#define,编译器只是会傻乎乎的将define后面的内容替换成定义的变量,拿 const double ASPECT_RATIO = 1.653;举例,如果这样定义后,代码中使用 ASPECT_RATIO 时,在编译代码的时候,会将 ASPECT_RATIO 变量统一替换成1.653这个数字. 看似这样做没什么问题,但是会带来可能的隐患. 隐患一:报错的时候,提示错误的原因会是1.653,这样不