用const给字面常量起个名字(标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量
定义的一般形式:
const 数据类型 常量名 = 常量值;
数据类型 const 常量名 = 常量值;
例如:
const float PI =3.1415f;
注意事项:
(1)常变量在定义时必须初始化
(2)常变量不能再初始化后重新赋值
const 与 #define 的区别
(1)const定义的常量有类型,而#define定义的没有类型,编译可以对前者进行类型安全检查,而后者仅仅只是做简单替换
(2)const定义的常量在编译时分配内存,而#define定义的常量是在预编译时进行替换,不分配内存。
(3)作用域不同,const定义的常变量的作用域为该变量的作用域范围。而#define定义的常量作用域为它的定义点到程序结束,当然也可以在某个地方用#undef取消
定义常量还可以使enum,在c++中尽量使用const(inline),enum替代#define
下面看一个程序:
#include <iostream>
using namespace std;
int main()
{
//常变量
//const int a; //error 定义常量必须要初始化
const int a = 3;
//a =4; //error 常量不能重新被赋值,值不能修改
//指针 const在*左侧,const修饰指针指向的内容,内容不能修改
const int* p = &a; //等价于//const int *p;
//p = &PI;
//*p = 4; //error,*p是一个常量不能在初始化后赋值
//int *p1 = &a; //error,p1是 int *类型, &a是const int *类型
//指针 const在*右侧, const修饰指针,指针初始化后不能指向新的地址
//int * const p2 = &a; //error p2为 int * const类型, &PI为const int *类型
int b = 100;
//int * const p2; //error p2为常量定义需要初始化
int * const p2 = &b;
*p2 =200; //ok
cout<<b<<endl; //200
int c=300;
//p2 = &b; //error p2不能重新赋值
const int *p3 = &b; //ok
//*p3 = 200; //error *p3的值不能修改
b=300; //ok
cout<<b<<endl;
return 0;
}
一般在高层次编程中使用const,inline,enum代替#define,在底层编程中使用#define
下面通过一个例子简单介绍一个#define的使用:替换就代表这灵活
#include <iostream>
using namespace std;
#define STR(a) #a
#define CAT(a,b) a##b
int main()
{
int x= 100, y=200,xy=300;
cout<<STR(x)<<endl; //#x<==>"x"
cout<<CAT(x,y)<<endl; //a##b <==>ab
return 0;
}
下面介绍一个宏定义容易引起副作用的例子
#include <iostream>
using namespace std;
#define GET_MAX(a,b) ((a)>(b)?(a):(b))
int main()
{
int a= 5;
int b=0;
cout<<GET_MAX(++a,b)<<endl; //7,a被累加了2次
cout<<GET_MAX(++a,b+10)<<endl; //10,a被累加了1次
return 0;
}