const修饰符
在C语言中,我们习惯用#define来定义常量,例如
#define MAX 100
实际上,这种方法只是在预处理时进行字符的置换,将所有的"MAX"替换成"100",过后程序中不再有MAX这个标识符。
这个MAX不是变量,没有类型,不占内存,容易出错。
C++提供了一种更为灵活安全的方式来定义常量,即使用const来修饰常量,例如:
const int MAX=100;
此处的MAX是有类型的,占用存储单元,有地址,可以用指针指向它,但是不能改变其值。
看下面这段代码:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
#define T1 a+a;
#define T2 T1-T1;
cout << "T2 is " << T2 ;
return 0;
}
初看程序结果似乎应该打印
T2 is 0
但是这个程序实际的结果是
T2 is 2
其原因是把第八行语句解释成为
cout<<"T2 is "<<a+a-a+a<<endl;
如果程序中使用const取代了#define,将不会出现这种错误。如下:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int const T1=a+a;
int const T2=T1-T1;
cout << "T2 is " << T2 ;
return 0;
}
执行结果:
因此C++建议用const取代#define定义常量
const修饰指针
1、指向常量的指针,例如;
const char * name ="hyx"; //声明指向常量的指针
该指针允许改变其所指的地址,但是不能改变所指的常量。
name[3]='a'; //错误,不允许改变指针所指的常量
name="xxxxxxx"; //合法,可以改变指针所指的地址
2、常指针是指把指针所指的地址定义为常量
顾名思义,该指针的地址为常量,不可更改,但其指向的数据可以更改。
3、指向常量的常指针
无论是地址还是该地址内的数据都不可更改。
说明
1、如果使用const定义一个整型常量,关键字int可以省略。例如下面两行定义是等价的:
const int MAX=100; const MAX=100;
2、常量一旦被建立,在程序的任何地方都不能改变。
3、与#define定义的常量不同,const定义的常量可以有自己的数据类型,这样C++在编译时进行更加严格的类型检查,具有良好的编译时的检测性。
4、函数的形参也可以用const说明,用于保证形参在该函数内部不被改变。