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