(1)什麼是引用?
引用就是變數的別名,操作乙個變數的引用也就相當於操作變數本身,這一點跟指標很類似,但是操作引用不用像操作指標一樣,利用取位址符號,很不方便。而操作引用的話,則跟操作普通變數一樣,所以c++之中更加鼓勵使用引用。
(2)c++函式為什麼要使用引用?
c語言之中大量利用指標作為形參或者函式返回值,這是由於值拷貝會有很大的消耗(比如傳入傳出乙個大的結構體)。所以在c++之中使用引用作為函式引數和返回值的目的和使用指標是一樣的。而且形式上更加直觀,所以c++提倡使用引用。
(3)c++函式返回引用
c++之中函式的返回分為以下幾種情況:
1)返回值方式:函式的返回值用於初始化在跳出函式時候建立的臨時物件。用函式返回值來初始化臨時物件與用實參初始化形參的方法是一樣的。如果返回型別不是引用的話,在函式返回的地方,會將返回值複製給臨時物件。且其返回值既可以是區域性物件,也可以是表示式的結果。
2)返回引用:當函式返回引用型別的時候,沒有複製返回值,而是返回物件的引用(即物件本身)。
語法:
型別 &函式名(形參列表)
特別注意:
1.引用作為函式的返回值時,必須在定義函式時在函式名前將&
2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本
前面提到利用引用作為函式形參和返回值的好處。
1)函式返回引用的時候,可以利用全域性變數(作為函式返回),或者在函式的形參表中有引用或者指標(作為函式返回),這兩者有乙個共同點,就是返回執行完畢以後,變數依然存在,那麼返回的引用才有意義。
#include int global_variable; //global variable
int &f(int t1, int t2) //return the reference of the global variable "global_variable"
int main(void)
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。
2) 不能返回區域性變數的引用。如下面的例子,如果temp是區域性變數,那麼它會在函式返回後被銷毀,此時對temp的引用就會成為「無所指」的引用,程式會進入未知狀態。
#includeusing namespace std;
float temp;
float fn1(float r)
float &fn2(float r)
int main()
int &f(int a, int b, int *result)
int main(void)
exp3:
int &t(int a, int b)
4)當返回類成員的引用時,最好是const引用。這樣可以避免在無意的情況下破壞該類的成員。由於返回的是生命期在函式退出的時候還存在的變數位址,所以函式返回值做的任何操作就相當於對這個變數位址指向的變數做的操作。如果在返回值前面加const那麼這個變數就不允許被修改。
#include const int &t(int a, int b, int &result)
int main()
5) 可以用函式返回的引用作為賦值表示式中的左值
#includeusing namespace std;
int value[10];
int error=-1;
int &func(int n)
int main(){
func(0)=10;
func(4)=12;
cout《總結:
(1)使用引用當作函式引數和返回值,效率更高。
(2)函式返回的物件引用,必須在呼叫函式前就已經存在,不允許返回區域性變數的引用!
(3)當不希望返回的物件被修改的時候,可以新增const。
參考:
C C 引用作為函式的返回值
語法 型別 函式名 形參列表 特別注意 1.引用作為函式的返回值時,必須在定義函式時在函式名前將 2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本 includeusing namespace std float temp float fn1 float r float fn2 f...
C C 引用作為函式的返回值
語法 型別 函式名 形參列表 特別注意 1.引用作為函式的返回值時,必須在定義函式時在函式名前將 2.用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本 返回全域性變數temp的值時,c 會在記憶體中建立臨時變數並將temp的值拷貝給該臨時變數。當返回到主函式main後,賦值語句a fn...
C C 引用作為函式的返回值
語法 型別 函式名 形參列表 特別注意 引用作為函式的返回值時,必須在定義函式時在函式名前將 用引用作函式的返回值的最大的好處是在記憶體中不產生返回值的副本 include using namespace std float temp float fn1 float r float fn2 floa...