define与const的区别

 

一、先谈谈const的几个作用:
1、const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查。
2、const修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型时,将“值传递”改为“const&传      递”可以提高效率。
   比较下面两段代码:
   void fun(A a); void fun(A const &a);
 第一个函数效率低。函数体内产生A类型的临时对象用于“值传递”参数a,临时对象的构造、复制、析构过程都将消耗时间。而第二个函数提高了效率。用“引用传递”不需要产生临时对象,省了临时对象的构造,复制、析构过程消耗的时间。但只用引用有可能改变a,所以加 const;
3、const 修饰函数的返回值:如果给“指针传递”的函数返回值加const,则返回值不能被直接修改,且该返回    值只能被复制给const修饰的同类型指针。例如:
const char *GetChar(void){}; char *ch = GetChar(); //error const char *ch = GetChar(); //correct
4、const修饰类的成员函数(函数定义体):任何不需要修改数据成员的函数都应该使用const修饰,这样即使    不小心修改了数据成员或调 用了非const 成员函数,编译器也会报错,const 修饰类的成员函数形式为:
      int GetCount(void) const;
二、define的作用
1、宏定义的作用:
#define MAX(x,y) (((x)>(y))?(x):(y)) 
即一个取较大值的定义,在这里要注意的是,在宏中需要把参数小心的用括号括起来。因为宏只是简单的文本替换,防止歧义。
2、连接宏参数:
#define str(s) #s #define cons(a,b) (int)(a##e##b) 
这里使用#把宏参数变为一个字符串,用##吧两个宏参数贴合在一起。
cons(2,3)实际上表示的就是整型值2e3,也就是十进制数的2000。
3、用宏定义得到一个字的高位和低位字节
#define WORD_LO(×××) ((byte)((word)(×××)&255)) #define WORD_HI(×××) ((byte)((word)(×××)>>8)) 
一个字由2个字节组成。因此WORD_LO取其中的参数的低8位,WORD_HI取参数的高8位。
4、宏定义与sizeof的使用
#define ARR_SIZE(a) (sizeof((a))/ sizeof((a[0])))
三、区别
#define 只是用来做文本的替换,例如
#define PI 3.1415926 float angel; angel = 20*PI/180;
那么,当程序进行编译的时候,编译器首先会将#define PI 3.1415926 以后所有代码中的“PI”全部换成3.1415926,
然后再进行编译,因此#define 常量的生命周期停止与编译期,它存在于程序的代码段,在实际程序中它只是一个常数,
一个命令中的参数,并没有实际的存在。
而const常量存在于程序的数据段,并在堆栈中分配了空间。const常量是一个Run-Time的概念,
它在程序中确确实实地存在着,并可以被利用、传递。const常量有数据类型,宏常量没有数据类型。
编译器可以对const常量进行类型的安全检查。

 

你可能感兴趣的:(C++)