原文地址:http://www.cnblogs.com/floatedclouds/archive/2011/10/13/2209917.html
(1)什么是引用?
引用就是變量的別名,操作一個變量的引用也就相當于操作變量本身,這一點跟指針很類似,但是操作引用不用像操作指針一樣,利用取地址符號,很不方便。而操作引用的話,則跟操作普通變量一樣,所以C++之中更加鼓勵使用引用。
(2)C++函數為什么要使用引用?
C語言之中大量利用指針作為形參或者函數返回值,這是由于值拷貝會有很大的消耗(比如傳入傳出一個大的結構體)。所以在C++之中使用引用作為函數參數和返回值的目的和使用指針是一樣的。而且形式上更加直觀,所以C++提倡使用引用。
(3)C++返回引用?
前面提到利用引用作為函數形參和返回值的好處。
C++之中函數的返回分為以下幾種情況:
1)main的返回值:返回0表示運行成功。
2)返回非引用類型:函數的返回值用于初始化在跳出函數時候創建的臨時對象。用函數返回值來初始化臨時對象與用實參初始化形參的方法是一樣的。如果返回類型不是引用的話,在函數返回的地方,會將返回值復制給臨時對象。且其返回值既可以是局部對象,也可以是表達式的結果。
3)返回引用:當函數返回引用類型的時候,沒有復制返回值,而是返回對象的引用(即對象本身)。
函數返回引用:實際上是一個變量的內存地址,既然是內存地址的話,那么肯定可以讀寫該地址所對應的內存區域的值,即就是“左值”,可以出現在賦值語句的左邊。
1)函數返回引用的時候,可以利用全局變量(作為函數返回),或者在函數的形參表中有引用或者指針(作為函數返回),這兩者有一個共同點,就是返回執行完畢以后,變量依然存在,那么返回的引用才有意義。
#include <iotream>
int global_variable; //global variable
int &f(int t1, int t2) //return the reference of the global variable "global_variable"
{
? ? global_variable =? t1 + t2;
? ? return global_variable;
}
int main(void)
{
? ? int f = f(1, 3);
? ? std::cout << global_variable << std::endl; //L1
? ? f(2, 8)++;
? ? std::cout << global_variable << std::endl; //l2
? ? f(2, 3) = 9;
? ? std::cout << global_variable << std::endl; //L3
? ? return 0;? ? ? ?
}
L1:執行過f(1,3),則global_variable變為4。
L2:執行過f(2,8)++,f(2,8)為10,可以執行++(表示其為左值),變為11。
L3:執行f(2,3),global_variable變為5,由于其是左值,修改了global_variable的值,為9。
#include <iostream>
? ? int &t(int a, int b, int &result)
? ? {
? ? ? ? result = a + b;
? ? ? ? return result;
? ? }
? ? int &f(int a, int b, int *result)
? ? {
? ? ? ? *result = a + b;
? ? ? ? return *result;
? ? }
? ? int main(void)
? ? {
? ? ? ? int t_variable;
? ? ? ? int *f_variable = new int;
? ? ? ? t(1, 2, t_variable)++;
? ? ? ? std::cout << t_variable << std::endl; //t_variable = 4
? ? ? ? f(1, 2, f_variable)--;
? ? ? ? std::cout << *f_variable << std::endl; //t_variable = 2
? ? ? ? delete f_variable;
? ? ? ? return 0;
? ? }
-------------------------------------------------------------------------------------------------------
int &t(int a, int b)
{
? ? return a+b; //now allowed
}
2)由于返回的是生命期在函數退出的時候還存在的變量地址,所以函數返回值做的任何操作就相當于對這個變量地址指向的變量做的操作。如果在返回值前面加const那么這個變量就不允許被修改。
#include <iostream>
? ? const int &t(int a, int b, int &result)
? ? {
? ? ? ? result = a + b;
? ? ? ? return result;
? ? }
? ? int main()
? ? {
? ? ? ? int t_variable;
? ? ? ? t(1, 2, t_variable);
? ? ? ? std::cout << t_variable << std::endl; //t_variable = 3
? ? ? ? t(1, 2, t_variable)++;
? ? ? ? std::cout << t_variable << std::endl; //not allowed
? ? }
小結:
(1)使用引用當作函數參數和返回值,效率更高。
(2)函數返回的對象引用,必須在調用函數前就已經存在,不允許返回局部變量的引用!
(3)當不希望返回的對象被修改的時候,可以添加const。