[C++] effective_C++_条款02

本文探讨了C++编程中使用const,enum,inline替代#define的原因及方法,并介绍了如何定义类专属常量,以及枚举技巧的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款02:尽量用const, enum, inline代替#define

  • 该原则言下之意是说使用编译器替换预处理器

  • 假设你使用下面的表达式:

    
    #define ASPECT_RATIO 1.653
    

    记号名称ASPECT_RATIO也许从未被编译器看到,也许在编译器开始处理源代码之前它就被预处理器移走了,于是ASPECT_RATIO可能从来没进入记号表中,于是当你运用此常量但获得一个编译错误信息时,你可能不知道这个1.653是什么意思,这就是#define的坏处。

    因此你可以使用一个常量来替换上述的宏:

    const double AspectRatio = 1.653;

    作为一个语言常量,AspectRatio肯定会被编译器看到,当然会进入记号表中

  • 在定义常量指针时,由于常量定义通常被放在头文件中,以便被不同的源码包含,因此有必要将指针声明为const,例如若要在头文件内定义一个常量的char*字符串,需要些const两次:

    const char* const authorName = "Scott Meyers";
  • class专属常量。为了将常量的作用域限制于class内,你必须让它成为class的一个成员,而为确保此常量至多只有一份实体,必须让它成为一个static成员:

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

    通常C++要求所使用的任何变量均需提供定义式,但如果它是一个class专属常量又是static且为整数类型(integral types, ints, chars, bools),则需特殊处理,只要不取它们的地址,可以只声明并使用它们而无需提供定义式;但如果你取某个class专属常量的地址,你就必须提供下面的定义式:

    const int GamePlayer::NumTurns; // 定义

    在C++中,在默认情况下,全局变量的链接性是外部的,但const全部变量的链接性是内部的,也就是说,在C++看来,全局const定义就像使用了static说明符一样。

  • 全局变量在多线程中容易出问题, 一份优秀的代码是几乎不出现全局变量的

  • 一个属于枚举类型的数值可当做ints使用,即”the enum hack”

    class GamePlayer{
    enum {NumTurns = 5};
    int scores[NumTurns];
    };
  • the enum hack 技术的好处:

    • 当你不想让别人获得一个pointer或reference指向你的某个整数常量时,enum可以实现
    • enum和#define不会导致非必要的内存分配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值