如有错误,欢迎批评指正
一、二者的区别
①编译器对二者的处理方式不同
define宏是在预处理阶段进行展开,只做展开处理不做运算处理;
const常量是在编译和运行阶段使用。
②类型和安全检查不同
define宏定义是没有类型的,在预处理阶段不做任何类型安全检查;
const常量是有类型的,在编译阶段进行类型安全检查。
③存储方式不同
define宏定义是不分配内存的;
const常量定义是需要分配内存的。
④const常量可以节省空间,避免不必要的内存分配
例如:
#define SIZE 1024 ;//常量宏
const int NUM = 3; //必须进行初始化,此时分配内存,以后不再分配内存
int a = NUM; //只为变量a分配内存
int b = SIZE; //为变量b和SIZE分配内存
int c = SIZE; //为变量c和SIZE分配内存
⑤define宏可以定义函数,此时函数相当于c++中的内联函数,而const只能定义常量。
二、下面对二者的具体使用做一个详细的介绍
1、define的使用
在C++中,define的宏定义是将一个标示符定义为一个字符串,该标示符被称为宏名,字符串被称为替换文本。define宏定义有两种使用形式,一是不带参数的宏定义(简单的宏定义),另一种是带参数的宏定义。
①简单宏定义
例如:#define PI 3.1415;
在以后的程序中,使用标示符PI,就相当于使用3.1415,即完成从3.1415到PI的替换。
②带参数的宏定义
例如:#define SUM(x) x+x;
int a = SUM(3)* 4;//计算a是多少??
计算的过程如下:
将SUM(3)进行替换,即a = 3 + 3 * 4,因此a = 15,这就证明了define宏定义只做替换处理,不做运算处理。
2、const的用法
①const定义常量
例如:const int NUM = 1024;//注意,必须进行初始化
②const用于指针
例如:int a = 12;
int b = 45;
const int *pa = &a;//pa是变量,可以修改pa的值;*pa是常量,不能通过修改*pa的值来修改a
pa = &b; //是合法的语句
*pa = 4; //是非法的语句
int *const pb = &b;//pb是常量,是不能修改的;*pb是变量,可以通过修改*pb的值来修改b
pb = &a; //是非法的
*pb = 12; //是合法的
③const用于函数
当const用于修饰函数的形参时,在函数的内部是不能修改此值的:
void f(const char *str);//在函数的内部是无法修改str所指向的内容
void f (const class& ref);//在函数的内部是无法修改引用ref的所引用的变量的值
④const用于类内部
const数据成员是存在的,但并不是像我们想象的那样。const数据成员只在类的某个对象的生命周期内是常量,而对于整个类而言任然是变量。因此const数据成员不能在类声明的时候进行初始化,应在类的构造函数初始化列表中进行初始化。
例如:class A{
const int NUM= 10;//错误,不能在类声明中初始化常量
char len[NUM]; //错误,未知的NUM
}
class A {
const int NUM;
A(int num);//构造函数
}
A::A(int num):NUM(num) //初始化列表中,初始化常量
{
........
}