C++中应该使用const,enum,inline而非#define

来源:互联网 发布:淘宝分类没法横向布置 编辑:程序博客网 时间:2024/06/05 21:14

1、使用#define target source,会引发预处理器的处理而不是编译器的处理,预处理器只会将程序中出现target 的部分替换为source,不会做语法检查。

当如下情况时:

#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))

int a = 3,b=2;

CALL_WITH_MAX(++a,b);   //这样会导致a前加两次,返回的值就不是CALL_WITH_MAX(a,b)中的a,而是++a,这违背了程序的意图

CALL_WITH_MAX(++a,b+3);//这种情况正常

而我们如果使用内联函数,就不会出现这种情况了

template<typename T>

inline void callWithMax(const T&a,const T&b)

{

    return (a>b?a:b);

}

2、使用#define预定义一个常量,当程序出现错误时,会给调试带来不便

#define MAX_NUM 100

如果程序出现关于MAX_NUM引起的编译错误,错误信息会指向数值100,而非预定义字符MAX_NUM,如果#define所在头文件不是自己写的,这就会给寻找100

所代表的含义带来不便。

C++中定义常量最好使用const

使用const定义指针的时候需要注意

    1)、const char* const sName  = "Join";

    应该尽量使用const string sName("Join");

    2)、关于const T*p 和T *const p

    没有必要区分哪个是常量指针,哪个是指针常量,不过是文字游戏,自己明白什么意思就行,当const位于*左边时,说明p指向的内容为常量,不可修改

    当const位于*右边时,说明指针p为常量,只能指向初始化时指向的内存地址,不可给p重新赋值,但其指向的空间的内容可以修改。

    3)、当const出现在一个类中时

    为保证const变量只被赋值一次,应声明为static(保证在整个类中都是恒定常量)

     class Test

    {

          public:

                Test(const int val):a(val){}

          private:

                const int a;  //只能在构造函数的初始化列表初始化

                static int b;//在类的实现文件中初始化

                 static const int c;//同const static int c

    }

       int Test::b = 0;

       const int Test::c = 0;

===============================================================================================================

1、关于enum

当一个成员函数需要一个常量时,enum是最好的选择

class Test

{

    public:

            Test();

          enum{length = 5};

         int getEnum()

        {

                return length;

        }

    private:

        int nums[length];

}

//不能用指针或者引用指向一个enum

int *p = t.getEnum();          //error

int &r = t.getEnum();          //error



0 0