zoukankan      html  css  js  c++  java
  • 条款02:尽量以const,enum,inline替换#define

    1. 总结

    • 对于单纯常量,最好以const常量或enum替换#define
    • 对于宏代码段,最好改用inline函数替换#define

    2. 使用const常量或enum替换宏常量

    当我们以const常量替换#define,有两种特殊情况值得说说。

    class外部的常量指针

    第一种是定义class外部的常量指针,这种常量定义式通常放在头文件内以便被不同的源文件使用,因此有必要将指针本身声明为const。
    例如要在头文件内定义一个常量char *-based字符串,必须写两次const(左数右指),如下所示。

    const char *const authorName = "Scott Meyers";  //必须写两次const,左数右指
    const std::string authorName("Scott Meyers");   //更好的做法是采用string类型
    

    class专属常量

    第二个值得注意的是class专属常量,为了确保该常量最多只有一份实体,必须让它成为static成员变量。

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

    注意,该示例中展示的是NumTurns的声明式而非定义式,定义式应按照类的static成员变量的语法要求在.cpp文件中进行。
    但如果一个常量既是class专属常量又是static且为整数类型(int、char、bool等),则需特殊处理,只要不取它们的地址,你可以声明并使用它们而无需提供定义式。
    注意,in-class初值设定只适用于static整数常量,而且即使是static整数常量,有些编译器也可能不支持这种操作,遇到这种情况,可以将初值放在定义式中。

    class GamePlayer
    {
    private:
        static const double FudgeFactor;  //非整数常量,无法进行-in-class初值设定
        static const int NumTurns;        //即使是整数常量,编译器也可能不支持in-class初值设定
    };
    
    //static常量定义,位于.cpp文件
    const double GamePlayer::FudgeFactor = 1.35;
    const int GamePlayer::NumTurns = 5;
    

    如果编译器不支持static整数常量的in-class初值设定,但该常量又必须在class编译期间使用,如GamePlayer::scores数组大小,可改用enum代替const。

    class GamePlayer
    {
    private:
        enum { NumTurns = 5 };
        int scores[NumTurns];
    };
    
  • 相关阅读:
    surging+EFCore 服务实现入门
    surging+CentOS7+docker+rancher2.0 入门部署教程
    Aspnet Zero中使用Windows service (Topshelf)来承载Quartz.net任务
    解决 EntityFrameworkCore tool 3.1 init.ps1 is not recognized 问题
    基于Bitnami gitlab OVA包的gitlab 环境搭建
    基于ng-zorro的ASP.NET ZERO前端实现
    图像滑动窗口分割
    论文答辩准备
    transgan_pytorch
    Pytorch常用代码整理
  • 原文地址:https://www.cnblogs.com/songhe364826110/p/12182834.html
Copyright © 2011-2022 走看看