在C++的開發(fā)中咽安,我們知道,要給一個(gè)變量取別名的語(yǔ)法是Type& name = var蓬推,此時(shí)需要修改變量指向的空間妆棒,除了用變量直接修改,還可以通過指針沸伏,另外一個(gè)就是使用別名修改(C++中引用)糕珊。
下面設(shè)定了ABCDEF測(cè)試函數(shù):
- int getA() 作為是最常見的函數(shù)形式,直接將數(shù)值返回 int毅糟。
- int& getB() 的返回值int&红选,此時(shí)可以用一個(gè)變量取把地址別名在主調(diào)函數(shù)中接收過來(lái)。
- int& getC() 的返回值是int&(與B相同),此時(shí)我們返回的是內(nèi)存塊的別名留特,別名作為左值可以對(duì)其內(nèi)容進(jìn)行操作纠脾。但是沒有辦法作為右值賦值玛瘸,不能返回局部變量的引用。主要原因是局部變量會(huì)在函數(shù)返回后被銷毀苟蹈,因此被返回的引用就成為了"無(wú)所指"的引用糊渊,程序會(huì)進(jìn)入未知狀態(tài)。
- int getD()和int& getE()和上面的解釋一致慧脱,只不過是在函數(shù)體內(nèi)聲明了一個(gè)static的標(biāo)識(shí)符渺绒,代表該變量是靜態(tài)的不需要重復(fù)賦值,有自己的內(nèi)存區(qū)域菱鸥,函數(shù)消失后不會(huì)自動(dòng)銷毀宗兼。
#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的意思實(shí)際上是內(nèi)存空間的別名,分配了4個(gè)字節(jié)的內(nèi)存
int &b = a;//在這里起一個(gè)別名氮采, 語(yǔ)法為: 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;
// 此處相當(dāng)于返回一個(gè) 11 這個(gè)時(shí)候是沒有辦法進(jìn)行賦值的: 11 = 100殷绍;僅僅是一個(gè)數(shù)值,沒有內(nèi)存地址
//getD() = 100;
//此處是相當(dāng)于返回了一個(gè) 開辟了內(nèi)存空間的變量地址鹊漠,是允許需改內(nèi)容的: a = 100;
//但被調(diào)用的函數(shù)當(dāng)作左值的時(shí)候主到,必須返回一個(gè)引用
getE() = 100;
//該代碼在C的編譯器下是無(wú)法通過的 需要改寫成 *(a1 > a2 ? &a1 : &a2) = 100;才能在C的編譯器下通過
//但是該代碼在C++編譯器下是沒有問題的,已經(jīng)做了內(nèi)部?jī)?yōu)化
(a1 > a2 ? a1 : a2) = 100;
printf("a1: %d \n",a1);
printf("a2: %d \n",a2);
printf("a3: %d \n",a3);
//此處是手工打造改變內(nèi)存空間的條件
*(getF()) = 100;
getF();
system("pause");
return 0;
}
C++ 引用的作用和用法
網(wǎng)上摘抄了一段覺得非常好的總結(jié)躯概,如下:
引用的好處之一就是在函數(shù)調(diào)用時(shí)在內(nèi)存中不會(huì)生成副本登钥。
引用總結(jié)
在引用的使用中,單純給某個(gè)變量取個(gè)別名是毫無(wú)意義的娶靡,引用的目的主要用于在函數(shù)參數(shù)傳遞中牧牢,解決大塊數(shù)據(jù)或?qū)ο蟮膫鬟f效率和空間不如意的問題。
用引用傳遞函數(shù)的參數(shù)姿锭,能保證參數(shù)傳遞中不產(chǎn)生副本塔鳍,提高傳遞的效率,且通過const的使用呻此,保證了引用傳遞的安全性献幔。
引用與指針的區(qū)別是,指針通過某個(gè)指針變量指向一個(gè)對(duì)象后趾诗,對(duì)它所指向的變量間接操作蜡感。程序中使用指針,程序的可讀性差恃泪;而引用本身就是目標(biāo)變量的別名郑兴,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。
使用引用的時(shí)機(jī)贝乎。流操作符<<和>>情连、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)览效、賦值操作符=的參數(shù)却舀、其它情況都推薦使用引用虫几。