zhiyinjixu

  博客园  :: 首页  ::  :: 联系 ::  :: 管理

有关const的用法总结:

一、const和指针
判断规律:
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针所指的变量不能修改;
如果const位于星号的右侧,const就是修饰指针本身,即const指针。


int a = 500; 
const int* p = &a ;                       //第一大类: 指向const的指针
int const *p = &a ;                      //和上面的没有区别
int* const p = &a ;                      //第二大类: const指针
const int* const p = &a ;            //第三大类:  指向const的const指针

第一大类:指向const的指针
(1)符号常量

所谓“符号常量”就是“只读变量”也就是 “const修饰的变量”。(以后没有特殊注明,符号常量都是指const修饰的变量)

const int a = 5;                          //a此时呢就相当于一个常量了,a的值再不能改变了


(2)指向const的指针:
指向const的指针既可以指向普通变量,也可以指向符号常量。(所以,如果不修改变量的值的话,最好将其定义为指向const的指针,这样该指针既可以指向普通变量,也可以指向符号常量)
下面是指向普通变量时的情况:

①不能通过该指针来修改变量的值;
②指针的指向是可以修改的;
③变量的值本身是可以修改的;


int a = 4, b = 6;
const int *p;                       //定义了指向const的指针
p = &a;                             //给该指针初始化
*p = 5;                              //错误,说明了①
p = &b;                            //正确,说明了②
a = 88;                              //正确,说明了③


(3)指向符号常量的指针
对于符号常量只能用指向const的指针来指,不能用普通的指针:
const int a=0;
int *p1 = &a;                         //错误
const int *p2 = &a;                //正确

注:此用法常用在只读数组中
int main ()
{
const char a[] = "hello";  //定义只读数组
const char *p = a;                         //写成 char *p = a;  就是错误的,因为用const 修饰的变量只能用指向const 的指针来指 。
}

对于只读数组呢,不存在指向的问题,只不过是个数据类型相同的事情 。


第二大类:const指针

①指针本身是一个常量,只能指向定义时所给的那个数据,而不能再指向别处;
②const指针所指向的变量可以通过const指针来修改。

int a = 2, b = 5;
int * const p = &a;
p = &b;                 //错误,说明①
*p = 8;                  //正确,说明②

const指针可以接受const地址和非const地址,但是非const指针只能接受非const地址。所以const指针的能力更强一些,所以尽量多用const指针,这是一种习惯。

注:对上面的这句话中所说的 “const指针可以接受const地址”的理解:const地址就是指符号常量;const指针当然单独是不能接受符号常量的,要想通过const指针接受符号常量,就得用指向const的const指针,即第三大类。他说的是这个意思。

第三大类:指向const的const指针
就是上面两种情况合到了一块

①不能通过该指针来修改变量的值;
②const指针的指向是不能修改的。

int a = 2, b =5;
const int *  const p = &a;
*p = 1;                 //错误,说明①
p = &b;                //错误,说明②


二、const和引用——常引用

相当于const和指针上的第一大类的情况,即指向const的指针

常引用既可以是普通变量的引用,也可以是符号常量的引用(所以,如果不修改变量的值的话,最好将其定义为常引用,这样,该引用既可以是普通变量的引用,也可以是符号常量的引用。)
①不能通过常引用来修改变量的值
②可以通过变量本身来修改变量的值

int a=4;
const int & ra = a;  //定义常引用
ra = 5;                     //错误,说明了①
a = 5;                     //正确,说明了②

 注:常引用在<<操作符重载中很常见,如:friend  ostream & operator<< (ostream &,const A &);

三、其他注意点
(1)在c语言中,数组的长度不能为const修饰的变量;而在c++中是可以的。

const int a=5;
int m[a];
上面的写法在c++中是正确的,但在c语言中是不允许的。在c语言中认为 常量 != 只读变量.也就是说在c语言中不能用const来定义常量,在c语言中可以用 #define的宏、enum 类型来定义常量。

 

 

 

 

 

posted on 2011-11-14 16:19  zhiyinjixu  阅读(217)  评论(0)    收藏  举报