您的位置:首页 > 编程语言 > C语言/C++

C++中const用法详解

2011-12-13 10:46 573 查看
之所以详细讨论C++中const的用法,主要是因为在使用const限定指针时存在一些需要注意的地方。以下将按三个方面讨论const的用法,分别为:1、const的基本概念以及定义一般变量的用法;2、使用const定义指针时需注意的问题:a) const指针 和 b) 指向const对象的指针

1、const的基本概念以及定义一般变量的用法
    const是C++中声明和定义变量时的一个限定关键字,用来指明所声明和定义的变量具有const属性,也就是被const修饰的变量是一个常量,常量的值必须在定义时初始化,并且在其生存期内不能改变其初始值。对于一般类型或类类型(除指针类型)直接使用const限定符就可以,举例如下:
const int a;  //错误!需要在定义时初始化const类型
const int a = 0;  //正确!在定义时初始化const类型变量a为0,且a在其生存期内的值只能为a,不能改变
int const a = 0; //正确!在定义时初始化const类型变量a为0,且a在其生存期内的值只能为a,不能改变
PS:在定义一般类型或类类型时,const限定符与类型名称的顺序无关,也就是说const int 与 int const完全相同。

2、使用const定义指针时需注意的问题
    此时主要需要区分两种类型: a) const指针 和 b) 指向const对象的指针 。这两种类型的区分是根据定义时const的位置决定的。首先,说明一下什么是const指针 和 指向const对象的指针:a) const指针指的是此指针为const类型的,也就是说此指针需要在定义时初始化且指针的值在生存期内不能变(说白了就是在定义指针时就要说明这个指针是指向哪个对象的,而且在这个指针的生存期内不能将这个指针再指向其他对象);b) 指向const对象的指针是指指针所指向的对象具有const的属性,也就是说指针所指向的那个对象必须在定义时初始化且在生存期内不能变更值。
    注意出现需要区分上述情况是由于const属性和指针的特殊性引起的:因为指针涉及到两个对象,一个指针本身,一个是指针指向的对象,这两种说法区分了指针本身具有const属性和指针指向的对象具有const属性的情况。具体来说,const指针的说法比较好理解,因为既然存在对const类型变量的需求,自然存在对const类型指针的需求,指针也是一种特殊的变量。但是为什么要定义指向const对象的指针呢,在这种情况下将指针指向的对象定义成const不就行了吗,其实是不行的,这需要从原理说起,假设定义了一个const型的变量,如
const int a;现在需要定义指向其的指针pa,假设无法在定义时说明pa指向的类型是否为const,那么可以定义int * pa = &a; 此时如果通过pa更改变量a的值,由于在执行时pa只是存储了对象a的地址,不知道pa指向的对象a不能更改,那么a的定义const int a;里的const限定符就因为指针而形同虚设了,所以编译器会检查这种非法的情况,那么如果真的需要使用一个指针指向const对象时,定义一个指向const对象的指针就派上用场了。
    下面举例说明怎么定义这两种属性的指针:(注意这两种属性相互独立,可以只具有一个,也可以两个都具备)
//const指针的例子
int a; //定义变量a
int * const pa = &a; //定义const类型的指针,此时指针pa只能在定义时初始化,在生存期内不能指向其他地址

//指向const类型的指针的例子
const int a;  //定义一个具有const属性的变量
const int * pa = &a;  //定义一个指向const对象的指针的pa,注意此条命令等同于int const * pa = &a;

//既是const指针又是指向const类型指针的例子
const int a;
const int * const pa = &a;

PS:如何记忆呢,关键是以*为分界符,其后的const修饰指针,其前的const修饰指针指向的内容。可以记忆为离谁近就是修饰谁。

注意:指向const类型的指针可以指向非const变量,此时只是不能通过此指针修改变量的值,变量的用法不受影响。也就是说在下面的例子中
int a = 0;
const int * pa = a;
代码a = 1;是合法的,代码*pa = 2;是不合法的。

顺便说明:在多指针变量定义中,对于第一个之后的变量只是*前的限定符有效,就是说:
int * a,b;相当于int * a;int b;
const int * a,b; 相当于const int *a; const int b;

一个更好的讲解:http://www.cnblogs.com/wintergrass/archive/2011/04/15/2015020.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 编译器 存储 c