理清 指针、引用和const的”暧昧“关系 (1)

类别:编程语言 点击:0 评论:0 推荐:

  理清 指针、引用和const的”暧昧“关系 (1)


在C++中,指针和引用的引入大大的方便了developers的工作。但是一旦和const勾搭到了一起,它们就有点不太听话,经常会给
初学者带来一些困惑。下面就我的所知,将"const+指针"及"const+引用"总结一下,不当之处还请指点。

一、指针和引用
 关于 指针和引用的基本用法大家都知道。偶就不具体介绍了。
 
二、const+指针
 为方便起见,我们用基本的数据类型int的指针来介绍。替换成其他的类型同理(但如果是两个单词组成的类型,如int *要注意,可能会有结合次序的问题)
 如下面所示:const 和指针交错在一起,有三种形式
 int i = 10;
 (1)const int * pi1;
 (2)int const * pi2;
 (3)int * const pi3 = &i;
 其中(1)const int* 和(2)int const * 用法相同(我自己的总结,没见过教科书这样说,哪位高手知道区别的话,请指教,3x!^_^)
 下面着重比较(1)与(3)的区别。
 可以用下面的方法巧妙地区别他们
 1、在(1)(2)中,const是和类型int紧紧依偎在一起,所以指针pi1和pi2指向的对象是const int型的。既然是const的对象,当然
  不能通过解引用指针来改变他们的值。但是因为指针pi1自身和const不靠在一起,山高皇帝远,所以const对pi1并没有束缚力,
  可以随便改变指向的对象。例如
  const int i = 10;
     int j = 20;
  const int*pi=&i;
  *pi = 11;    //错误:不能通过pi来改变i的值
  pi = &j;     //正确:指针本身并非const,所以可以改变指向的对象
  
  这里用了一个const int 和int型的变量,是为了让读者知道int型的变量可以被赋给const int的,但是反之不行。
 
 2、在(3)中,const紧紧靠着指针变量pi3,pi3不敢妄为,必须被接受初始化,指向一个对象,而且初始化后只能乖乖的接受这样
  的事实。但是为了安抚它,也给了它一点特权,允许通过指针pi3改变一下指向的对象的值。如下例所示:
  int i = 10;
  int j = 20;
  int * const pi = &i; //必须要被初始化
  pi = &j; //错误:如果这样做,要被满门抄斩的
  *pi = 11;   //可以,i现在是11了
 
三、const + 引用
 先介绍一下引用特殊的地方
 引用必须被初始化,初始化后引用变量就和被引用变量捆绑在一起,不能重新指向新的引用,对引用变量操作都是作用在被
 引用变量上的。例如:
 int i = 10;
 int j = 20;
 int & ri = i; //必须初始化
 ri = 11;  //改变了i的值
 ri = j;   //引用变量ri现在指向j了吗?NO! ri还是指向i,这等效于i = j;只是用j来赋值给i罢了,i的值现在是20
 
 
 同二中,const+引用可以总结为三种形式:
    int i  
 (1)const int & ri = i;
 (2)int const & ri = i;
 (3)int & const ri = i;
 同指针一样,(1)和(2)是相同的。
 1、我们先从(3)开始说起,同指针类似的,const在这里只是对ri起作用,我们可以通过引用变量ri来改变被
  引用变量i的值。我们说过,引用本来不可以重新指向对象,所以这里没有这个const也是一样的,但是如果出现了这样的语句
  结果会如何呢?我们看下面的代码:
  int i = 10;
  int j = 20;
  int& const ri = i;
  ri = 11; //i现在是11
  ri = j;  //OK!虽然有const限制,但是仍然是可以的,因为这里并不是改变指向的对象,只是用j的值来赋值而已
 
 2、(1)(2)就和指针差不多完全一样了,不可以改变通过ri改变值。如:
  int i =10;
  int j =20;
  const int&ri1 = i;
  int const& ri 2 = i;
  ri1 = 11; //错误,就算是ri = 10也不可以
  ri2 = 20; //错误,同上
  i = 1;  //OK! 对i并没有限制啊
 
四、对指针的引用
 对指针的引用有一些容易让人误解的地方。具体以后再介绍。

本文地址:http://com.8s8s.com/it/it25520.htm