const关键字主要是阻止对变量或者参数的改变。对const关键字主要有四种用法:
(1)const变量
可以将const应用于一个简单的变量。一旦变量被使用const定义后,编译器将拒绝所有的为这个变量赋值的语句。给这个变量赋值的唯一方法就是通过初始化来完成。
const int i = 123;
i = 1000; //Error!
也可以将数组和类这样的符合类型声明为const的。这时对象中的所有成员(元素)都将被保护而不被改变。
(2)const指针
const指针的规则是const变量在逻辑上的一个扩展。
可以将一个指针声明为const类型。const int *p,也就是说p指向一个不能被改变的整数型。尽管p本身可以改变,但*p是不能被改变的。
const int *p;
(const) int i=20,k=40;
p=&i;
*p=100; //Error!
p=&k; //允许指针变量指向另外一个同一类型的别的变量
C++中关于指针和const型数据相互作用的规则是:
一个const型的指针既可以指向const型的数据也可以指向非const型的数据;
一个普通的指针不能指向const型的数据。
const int i =123;
int *p = &i; //Error!This is noe allowed.
也可以在一个指针声明的内部使用const关键字:
char s[]="amirural";
char * const p = s; //s必须被初始化
p="rural"; //Error,指针值不可修改
*p = 's'; //可借助p对所指变量重新赋值
(3)const参数类型 (const最重要的用法)
通常由引用来传递数据时,要防止对数据的改变。可以声明一个const型的指针参数来完成这项工作。函数得到指向数据的指针,但它不允许使用这个指针来改变数据的值。
例如,在函数定义的内部,*str、*pb、*pd的值是可读的,但下面试图向它们所指向的数据分配值的语句将会作为错误被标记出来;
void func(const char str[],const int *pb,const int pd);
...
*str = 's'; //Error
str[2] = 'f'; //Error,即使涉及到的是该指针所指地址的偏移量
*pb = 2; //Error
*pd = 4; //Error
(4)const型的成员函数和对象
这一点主要用在拷贝构造函数中。拷贝构造函数最后将要做的事情是改变它的参数,而用引用来传递参数的目的是为了提高效率,人们愿意使用引用来传递参数,但是要阻止拷贝构造函数改变参数的能力。于是,C++提供了这一技术,如果你使用const关键字声明了一个对象,那你就只可以调用这个对象的const型的成员函数。这样的函数不会改变成员变量。同时,除了使用构造函数外,你不能改变一个const型对象的任何成员变量。
通过将const关键字放在函数声明之后和函数定义之前,你就可以将一个成员函数声明为const型的。