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

C++ : :新特性之引用

2016-07-09 11:20 295 查看

C++ : : 引用

前言:引用是C++在C的基础上引入的新概念,今天我们就来剖析一下引用,看看这个新的概念有什么优势和缺点。

1:概念

引用是已经定义的变量的别名,例如一个已经定义的变量num,它的如果定义了它的引用变量refnum,则可以用refnum和num来交替表示这个变量。


2:创建引用变量

相比于C,C++给&又赋予了另一个含义,可以用其来创建引用变量。在用其创建引用变量时,&不是取地址运算符,而是类型标识符的一部分


例如:

int num;
int & refNum=num;           //创建引用变量


int&表示指向int类型的引用,上述声明可以实现将num和refNum互换,它们指向相同的值和内存单元。


3:引用和指针

引用看上去很像伪装表示的指针,实际上引用和指针还是有一些差别的。
①:引用必须在申明它时就被初始化,而不能像指针那样先声明再赋值。引用更接近于const指针,必须在创建时初始化,一旦与某个变量关联起来,就将一直效忠于它。

②:引用变量和它所关联的变量地址想用,而指针变量是开辟一块新的内存,来存储它所指向的内存的地址。


4:引用的用途

①、引用作为函数参数:

引用常被用作函数参数,使得函数中的变量名成为调用程序中变量的别名,这种传递参数的方被称为引用传递。

下面我们通过交换两个数的例子来体会一下引用变量作为函数参数:


void Swap(int a, int b)       //值传递
{
int tmp;
tmp = a;
a = b;
tmp = b;
}
void pSwap(int *a, int *b)     //址传递
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void refSwap(int &a, int &b)   //引用传递
{
int tmp = a;
a = b;
b = tmp;
}


按引用传递和按值传递看起来调用方式和函数交换方式都想同,当它所取得的效果却和指针传递方式相同,由于指针传递作为函数要开辟新的内存去接收实参所传递的地址,而类型和实参类型的引用变量则不需要开辟新的内存,所以一定意义上引用的传递效率要更高,当数据类型很大时,引用参数相比于指针将会很有用。


注意:当实参与引用参数不匹配时,如果形参为const引用类型C++会生成临时变量。

观察下面的实例:

int refCube(const int &ra)
{
return ra*ra*ra;
}
int main()
{
int a = 3;
long a1 = 3L;
int len[] = { 1, 2, 3, 4, 5 };
int ret1 = refCube(a);
int ret2 = refCube(a1);
int ret3 = refCube(len[2]);
int ret4 = refCube(3);
cout << "ret1:" << ret1   << endl;
cout << "ret2:" << ret2 << endl;
cout << "ret3:" << ret3 << endl;
cout << "ret4:" << ret4 << endl;
return 0;
}


(http://img.blog.csdn.net/20160709110355476)

(http://img.blog.csdn.net/20160709110407534)

转到反汇编代码后我们发现,如果形参是const引用类型的以下两种情况下调用函数会产生临时变量。

a、实参类型正确,但不能作为左值。// ret3,ret4

b、实参类型不正确,但可以作为左值。//ret2

当实参类型正确而且可以作为左值时,则不会产生临时 变量。

②:引用作为函数返回值

int Add(int a, int b)         //返回值不是引用
{
int tmp = a + b;
return tmp;
}
int& Addr(int a1, int b1)     //返回值是引用
{
int tmp = a1 + b1;
return tmp;
}


下面我们来看看反汇编代码:

(http://img.blog.csdn.net/20160709111822540)

所以,我们可以得到两个结论:

1、不要返回临时变量的引用。

2、如果返回对象出了函数作用域依然存在,则采用引用返回,因为这样更加高效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c语言 编辑器