在C++的開發中,我們知道,要給一個變量取別名的語法是Type& name = var,此時需要修改變量指向的空間,除了用變量直接修改,還可以通過指針,另外一個就是使用別名修改(C++中引用)。
下面設定了ABCDEF測試函數:
- int getA() 作為是最常見的函數形式,直接將數值返回 int。
- int& getB() 的返回值int&,此時可以用一個變量取把地址別名在主調函數中接收過來。
- int& getC() 的返回值是int&(與B相同),此時我們返回的是內存塊的別名,別名作為左值可以對其內容進行操作。但是沒有辦法作為右值賦值,不能返回局部變量的引用。主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態。
- int getD()和int& getE()和上面的解釋一致,只不過是在函數體內聲明了一個static的標識符,代表該變量是靜態的不需要重復賦值,有自己的內存區域,函數消失后不會自動銷毀。
#include "iostream"
using namespace std;
int getA(){
int a;
a = 10;
return a;
}
int& getB(){
int a;
a = 10;
return a;
}
int& getC(){
int a;
a = 10;
return a;
}
int getD(){
static int a = 10;
a ++ ;
printf("a: %d \n",a);
return a;
}
int& getE(){
static int a = 10;
a ++ ;
printf("a: %d \n",a);
return a;
}
int* getF(){
static int a = 10;
a ++ ;
printf("getF::a: %d \n",a);
return &a;
}
int main(){
int a = 10;//此處a的意思實際上是內存空間的別名,分配了4個字節的內存
int &b = a;//在這里起一個別名, 語法為: Type& name = var;
b = 20;//間接修改了a
printf("a:%d \n",a);
{
int *p = &a;
*p = 12;
printf("a:%d \n",a);
}
int a1 = 0;
int a2 = 0;
a1 = getA();
a2 = getB();
int &a3 = getC();
//& 表示取該變量的別名
int &a4 = a1;
a4 = 30;
// 此處相當于返回一個 11 這個時候是沒有辦法進行賦值的: 11 = 100;僅僅是一個數值,沒有內存地址
//getD() = 100;
//此處是相當于返回了一個 開辟了內存空間的變量地址,是允許需改內容的: a = 100;
//但被調用的函數當作左值的時候,必須返回一個引用
getE() = 100;
//該代碼在C的編譯器下是無法通過的 需要改寫成 *(a1 > a2 ? &a1 : &a2) = 100;才能在C的編譯器下通過
//但是該代碼在C++編譯器下是沒有問題的,已經做了內部優化
(a1 > a2 ? a1 : a2) = 100;
printf("a1: %d \n",a1);
printf("a2: %d \n",a2);
printf("a3: %d \n",a3);
//此處是手工打造改變內存空間的條件
*(getF()) = 100;
getF();
system("pause");
return 0;
}
C++ 引用的作用和用法
網上摘抄了一段覺得非常好的總結,如下:
引用的好處之一就是在函數調用時在內存中不會生成副本。
引用總結
在引用的使用中,單純給某個變量取個別名是毫無意義的,引用的目的主要用于在函數參數傳遞中,解決大塊數據或對象的傳遞效率和空間不如意的問題。
用引用傳遞函數的參數,能保證參數傳遞中不產生副本,提高傳遞的效率,且通過const的使用,保證了引用傳遞的安全性。
引用與指針的區別是,指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。
使用引用的時機。流操作符<<和>>、賦值操作符=的返回值、拷貝構造函數的參數、賦值操作符=的參數、其它情況都推薦使用引用。