C++ 引用

引用是某个对象(即变量)的别名.即某个对象的替代名称(相同于一个人的小名).

引用是一个左值,在C++中,引用主要用来定义函数的参数和函数返回类型.

因为引用只需要传递一个对象的地址,在传递大型对象的函数参数或从函数返回大型对象时,可以提高效率. 

使用引用时的注意事项:

①在定义引用时,引用符&与指针运算符一样,在类型和引用名之间的位置是灵活的,下面 3 种定义是完全相同的。

int& ir = i;       //& 靠近类型

int & ir = i;      //& 2不靠近

int &ir = i;       //& 靠近变量

②在变量声明时出现的&才是引用运算符(包括函数参数声明和函数返回类型的声明),其他地方出现的&都是地址操作符。

int i;
int &ir = i;                  //引用
int& func(int &i1, int &);    //引用参数,函数返回引用

③引用必须在定义时初始化,不能在定义完成后再给它赋值,为引用提供的初始值,可以是一个变量,也可以是另一个引用名,同一个变量可以定义多个引用

float f;
float &fr = f;
float &r1 = f;
float &r2 = f;
float &r3 = r1;

④引用实际是一种隐式指针,但是与指针的用法有很大的区别

  ❶ 指针必须通过解引用运算符"*"才能访问它所指向的内存单元.而引用不需要,用法与普通变量一样.

  ❷ 指针是一个变量,可以重新赋值.但是引用必须在定义时进行初始化,以后不能成为其他变量的引用.

    ❸ 有空指针,无空引用。

    ❹ 由于指针也是变量,所以可以有指针变量的引用。 

⑤建立引用时,有以下3个限制

      ❶ 引用本身不是一种数据类型,所以没有引用的引用,也没有引用的指针

      ❷ 不能建立引用数组

      ❸ 不能建立数组的引用

      ❹ 两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝 

//两者在作为形参的时候非常相似,区别是指针拷贝副本,引用不拷贝

#include<iostream>
using namespace std;

void pt(int *pta,int *ptb)
{
    int *ptc;
    ptc=pta;
    pta=ptb;
    ptb=ptc;
}

void ref(int &ra,int &rb)
{
    int rc;
    rc=ra;
    ra=rb;
    rb=rc;
}

int main()
{

    int a=3;
    int b=4;
    int *pa=&a;
    int *pb=&b;

    pt(pa,pb);
    cout<<"zhizhen: a="<<a<<",b="<<b<<endl;

    a = 3;
    b = 4;
    ref(a,b);
    cout<<"yinyong: a="<<a<<",b="<<b<<endl;

    return 0;
}
/*
输出结果:

zhizhen: a=3, b=4
yinyong: a=4, b=3
*/ 

⑥当使用&运算符取一个引用的地址时,实际上取到的是引用的变量的地址.

int i = 9;
int &ir = i;
int *p1 = &ir;
int *p2 = &i;

//结果是 pi = p2

⑦从内存上来讲,系统为指针分寸内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。

⑧引用访问对象是直接访问,指针访问对象是间接访问。

   间接访问的含义是先从其它内存空间获得要访问的内存地址,根据得到的地址访问目的地址。

⑨如果返回动态分配的对象或内存,必须使用指针,引用可能引起内存泄漏。

 

---------------------------------------------------------------------------------------------------
参考资料:
<<C++面向对象程序设计(第二版)>>

http://zhidao.baidu.com/question/321717839.html

http://blog.renren.com/share/275441937/12967099702

http://upc.gg.blog.163.com/blog/static/2979849820108281181754/

原文地址:https://www.cnblogs.com/LubinLew/p/reference.html