C++ 编程规范 1 常量

来源:互联网 发布:阿里云 代码托管 编辑:程序博客网 时间:2024/06/07 11:56

1 常量

不变的值更易于理解、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时候,应该把const

作为默认的选项。

规则1.1 使用const常量取代宏
说明:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显

示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。

示例:

    #define MAX_MSISDN_LEN (20)  //不好的例子
    const int MAX_MSISDN_LEN = 20; //好的例子

规则1.2 一组相关的整型常量应定义为枚举

说明:之所以使用枚举,基于:

 枚举比#define或const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从

    而避免错误发生。

示例:

    //好的例子:
    enum DayOfWeek{sunday,monday, tuesday, wednesday, thursday, friday, saturday};
    enum Color{black, blue, white, red, purple};

    BOOL ColorizeCalendar(DayOfWeek today, Color todaysColor);
    ColorizeCalendar(blue, sunday); //编译报错,Blue和Sunday位置错误

    //不好的例子:
    const int sunday = 0;
    const int monday = 1;
    const int black  = 0;
    const int blue  = 1;

    BOOL ColorizeCalendar(int today, int todaysColor);
    ColorizeCalendar(blue, sunday); //不会报错
 当枚举值需要对应到具体数值时,须在声明时显示赋值。否则不需要显式赋值,以避免重复赋值,

    降低维护(增加、删除成员)工作量。

示例:

    //好的例子:S协议里定义的设备ID值,用于标识设备类型
    enum TDeviceType
    {
       DEV_UNKNOWN = -1,
       DEV_DSMP = 0,
       DEV_ISMG = 1,
       DEV_WAPPORTAL = 2
    };
程序内部使用,仅用于分类的情况,不应该进行显式的赋值。

示例:

    //好的例子:程序中用来标识会话状态的枚举定义
    enum TSessionState
    {
       SESSION_STATE_INIT,
       SESSION_STATE_CLOSED,
       SESSION_STATE_WAITING_FOR_RSP
    };
 应当尽量避免枚举值重复,如必须重复也要用已定义的枚举来修饰,例如:

    typedef enum
    {
       RTCP_SR = 200,
       RTCP_MIN_TYPE = RTCP_SR,      //must be lowest known type
       RTCP_RR   = 201,
       RTCP_SDES  = 202,
       RTCP_BYE  = 203,
       RTCP_APP  = 204,
       RTCP_RTPFB = 205,
       RTCP_PSFB  = 206,
       RTCP_XR  = 207,
       RTCP_RSI = 208,
       RTCP_PUBPORTS = 209,
       RTCP_MAX_TYPE = RTCP_PUBPORTS  //must be highest known type
    } rtcp_type_t;

规则1.3 不相关的常量,即使取值一样,也必须分别定义

说明:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。

示例:

    //好的例子:协议A和协议B,手机号(MSISDN)的长度都是20。
    unsigned const int A_MAX_MSISDN_LEN = 20;
    unsigned const int B_MAX_MSISDN_LEN = 20;
    //或者使用不同的名字空间:
    namespace alib
    {
       unsigned const int MAX_MSISDN_LEN = 20;
    }
    namespace blib
    {
       unsigned const int MAX_MSISDN_LEN = 20;
    }

建议1.1 尽可能使用const

说明:在声明的变量或参数前加上关键字const用于指明变量值不可被篡改 。类成员函数加上const

限定符表明该函数不会修改类成员变量的状态。

使用const常见的场景:

 函数参数:传递引用时,如果函数不会修改传入参数, 该形参应声明为const。

 成员函数:访问函数(如get函数);不修改任何数据成员的函数;未调用非const函数、未返回数

    据成员的非const指针或引用的函数。

 数据成员:如果数据成员在对象构造之后不再发生变化, 可将其定义为const。

原创粉丝点击