C++关键字const

const的作用在于定义常量、修饰函数参数和返回值、修饰函数的定义体和类中某个函数为恒态函数。

const相对于C语言中的#define最大的区别在于:const所定义的常量在编译阶段必须知道它的值而#define定义的常量必须在预定义阶段就知道常量值;const定义的常量是带有数据类型的而#define只是做简单的字符串替换。

我们大体可以将const的作用分为以下几种:

1.常量数据。最基本的用法,被const修饰后成为常量,程序运行中不可以修改其值。

2.常量指针。常量指针可以理解成指向常量的指针,如下定义:

const int a = 10;

const int* p = &a;

首先,变量a被定义成常量,其值不能被改变,而指针p指向的是常量a,所以我们不能通过*p来改变常量a的值。但是指针的值本身是可以改变的,比如此时用常量指针p指向另一个常量b是被允许的,如下定义:

const int b = 20;

p = &b;

正如上例所示,常量指针作为作为指针时是一个变量,其可以指向不同的变量。于是考虑一个很正常的想法:能不能把第一个例子中的定义改成如下:

const int i a = 10;

int *p = &a;    //wrong

答案是否定的,虽然常量指针作为变量时其值可以改变,但是在定义指向常量的指针时,只能在定义常量指针时也加上const修饰符。

但有趣的是,常量指针虽然可以指向不同的元素,甚至可以指向非常量元素,但是对于常量指针而言,*p均不可以改变其所指向的元素的值,如下定义:

int c = 30;

p = &c;

*p = 40;   //wrong

所以常量指针一个非常重要的运用就是当我们在函数中不需要改变某个变量值时,可以通过指针传递,但是可以通过将形参中的指针定义为常量指针来防止数据被修改。

3.指针常量。指针常量顾名思义就是指针本身就是一个常量,它所指向的地址是一个固定值,在程序运行过程中不再被改变,而其所指向的地址中变量的值却可以改变,如下定义:

int a = 10;

int *const p = &a;

*p = 20;    //right

指针常量即指针本身是一个常量类型,指向的内存位置不变,所以在定义语句时必须就直接初始化,如果仅仅做声明int *const p;时不能通过编译的。

4.常量引用。常量引用的目的和常量指针的目的基本是一样的,通过引用我们将传递的参数更换别名,然后在调用函数中进行操作。通过给引用传递中的参数加上const修饰符,使得对原对象没有任何影响。

5.传递const值,函数参数传递除了通过指针和引用传递外,通过值传递也占了很大一部分。在值传递时如果参数表中将参数定义为const变量,则在接下来所有的操作中其值均不能改变。

6.const修饰(类)成员变量。在类中的变量被称为成员变量,有一点需要注意的是我们可以初始化常量却不能给常量赋值,因为类中变量声明时没有初值,所以在调用构造函数时才能给常量赋值。显然这是错误的,好在构造函数可以通过参数列表的方式来完成对常量成员的初始化工作(发生于进入函数体之前,不算赋值)。

但是即使如此,这里用const修饰成员变量,其“常量”的意义也仅仅是针对于某个具体的对象而言的,因为在创建不同对象时,传入的参数不同,即使属于同一个类,定义的不同对象之间,该常量值依旧会不同。

7.const修饰成员函数。首先通过const修饰的成员函数,const修饰符加在函数说明的后面,函数体之前,是函数类型说明的一部分。

const修饰的成员函数主要有两大作用,其一是对一般成员变量的访问时,类中所有数据成员的值都不能被改变。其二它是访问类中成员变量的唯一方式,如果不加const,类中所有通过const修饰的常量将不能被访问。

Advertisements