码迷,mamicode.com
首页 > 其他好文 > 详细

指针和引用

时间:2016-07-10 11:17:30      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

一、什么是引用???
  "引用"是C++中引入的新的变量类型,它的作用是为一个变量起一个别名。引用的使用形式如下:
   类型  &引用变量名=已定义过的变量名;
   例如:int a=10;
       int &b=a;

  b是a的引用,即b是a的别名,a和b的作用相同。对a所进行的操作的结果与对b所进行的操作结果是完全相同的。声明b为引用类型并不需要为b另外开辟空间来存放b,a和b代表同一块空间,具有同样的地址,声明b是a的引用可以理解为:使变量b具有变量a的地址。


二、引用的特点
1、一个变量可以有多个引用,即一个变量可以有多个别名。

2、引用可以传递
   例:int a=10; int &b=a; int &c=b;
&c=b与&c=a是完全相同的,因为b和a是同一个东西。

3、引用必须初始化,而且只能在初始化的时候引用一次,不能再改为其它变量的引用
    一般在初始化变量时,初始值会被拷贝到新建的对象中。然而在定义引用时,程序会把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一但初始化完成,引用将和它的初始值绑定在一起,不能再作为其它变量的引用。

    例:  int a=10,b=20;
          int &c;  &c=a;   //错误,引用在定义的时候必须初始化。
          int &d=a; &d=b;  //错误,引用只能在初始化的时候引用一次 

4、引用并不是创建一个对象,它只是为一个已经存在的对象起一个别名
    为引用赋值,实际上是把值赋给与引用绑定的对象。获取引用的值,实际上是获取与引用绑定对象的值,同理以引用作为初始值,实际上是以与引用绑定的对象作为初始值。

5、因为引用本身不是一个对象,所以不能定义引用的引用
   例:int &b; int &c=b;

6、在定义引用的时候,引用的类型必须要和绑定的对象的类型严格匹配,当然也有两种特例
    例: int a=10;
       double &b=a;  //错误
       int &c=1;     //错误,类型不匹配

7、const的引用
  可以把引用绑定到const对象上,就像绑定到其他对象上一样,称作对常量的引用,与普通引用不同的是,不能通过对常量的引用来修改它所绑定的对象。
    
  例:const int a=10;
    const int &b=a;
    a=20;       //错误,不能修改常量的值(在C++中被const修饰的是常量) 
    b=20;       //错误,不能通过常引用来修改它所绑定的对象

8、初始化和对const的引用
  第6条提到,引用的类型必须与对象的类型严格的一致,但是有两个特例。第一个特例就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转成引用的类型即可。允许为一个常量引用绑定非常量的对象,字面值,表达式等。
    
  例1: int a=10;
      const int &b=a;    //允许const int &绑定到一个普通的int对象上
      const int &c=10;   //允许const int &绑定字面值
      const int &d=c*10; //允许const int &绑定表达式
      int &v1=10;        //错误
      int &v2=c*10;      //错误
  例2:
    double i=7.3;
    int &r1=i;   //错误,i是double类型,r1是int类型,i赋给r1时会产生一个临时变量,也就是说r1会引用这个具有常性的临时变量,所以不能赋值
    const int  &r2=i;  //正确,常引用具有常性

  当一个常引用被绑定到另一个类型上时究竟发生了什么???
        double i=3.14;
        const int &x=i;
  此处x引用了一个int类型的数,对x的操作应该是整数运算,但是i却是一个双精度的浮点数,为了确保让x绑定一个整数,编译器会把上述代码变成如下形式:
        const int tmp=i;  //由双精度浮点型产生一个临时的整形常量
        const int &x=tmp; //x绑定这个临时变量
  在这种情况下,x绑定了一个临时量对象。这个临时量对象就是当编译器需要一个空间来暂存表达式的求值结果临时创建的一个未命名的对象。

9、对const的引用可能引用一个并非const的对象
   int i=10;
   int &r1=i;         //正确,让r1绑定i
   const int &r2=i;   //正确,让常引用r2绑定i,但是不允许通过r2改变i
   r1=20;             //正确
   r2=20;             //错误,r2是一个常引用不能通过r2改变i

10、引用作为函数参数
  我们知道在C中参数传递有两种方式"值传递"和"址传递",但本质上都是值传递,要在函数外改变变量的值,就必须要进行址传递。而c++中又引入了引用型变量作为函数形参。
   例:实现两个数交换的函数
    址传递,形参是指向实参的指针:
     void swap(int *a,int *b)
     {
       int tmp = *a ;
            *a = *b ;
            *b = tmp;
     }

     引用传递,其中形参是实参的别名:
     void swap(int &a,int &b)
      {
         int tmp =a ;
         int a =b ;
       int b = tmp;
      }

这两种方式的不同:
1、使用引用类型就不必在swap中声明形参是指针变量。指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不需要单独占内存单元,它是实参的别名。
2、这种方式比指针变量更加直观,方便。
3、引用传递效率非常高。


11、当不希望函数内改变函数外的值时,尽量采用常引用传参 
例:
void print(constint & a)
{
  cout <<a << endl;
}

12、传引用作为返回值
int &Add(constint & a, const int & b)
{
   int z = 0;
    z =a + b ;
   return z;
}
看一下这段代码所生成的汇编语言:
技术分享

技术分享
写出这样的代码,程序注定是活不长的,所以不要返回一个临时变量的引用。
如果要返回的对象出了当前函数的作用域依然存在,那么最好返回引用,因为这样更高效。



三、指针和引用的区别和联系:
1、引用只能在定义时初始化一次 ,之后再不能与其他变量绑定。指针变量的值可变。
2、引用必须指向有效的变量,指针可以为空。
3、sizeof在求取指针对象和引用对象的值不同,sizeof引用得到的是所引用对象的大小,sizeof指针得到的是对象的地址大小。
4、引用时(++)和(--)相当于给变量自增自减,给指针进行自增自减则会改变指针的指向。
5、相对而言引用比指针更加安全。

指针和引用

标签:

原文地址:http://blog.csdn.net/lf_2016/article/details/51869522

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!