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

本文探讨了C++编程中的预处理器使用、宏定义、常量定义、模板、枚举等核心概念及其常见陷阱,提供了避免错误和提高代码质量的实用建议。

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值