菜鳥(niǎo)教程 - C++ 把引用作為返回值
先上代碼:
#include <iostream>
using namespace std;
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues( int i )
{
return vals[i]; // 返回第 i 個(gè)元素的引用
}
// 要調(diào)用上面定義函數(shù)的主函數(shù)
int main ()
{
cout << "改變前的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
setValues(1) = 20.23; // 改變第 2 個(gè)元素
setValues(3) = 70.8; // 改變第 4 個(gè)元素
cout << "改變后的值" << endl;
for ( int i = 0; i < 5; i++ )
{
cout << "vals[" << i << "] = ";
cout << vals[i] << endl;
}
return 0;
}
看到這部分時(shí),一直想不通
setValues(1) = 20.23;
這步是什么意思,怎么就改變了值了呢,一度認(rèn)為是不是代碼寫(xiě)錯(cuò)了或者遺漏了什么。
但是經(jīng)本地代碼編譯實(shí)踐,輸出正常代碼沒(méi)錯(cuò),后來(lái)經(jīng)同事點(diǎn)撥才恍然大悟,下面一塊來(lái)辨析下!
我錯(cuò)在哪里
根據(jù)以往經(jīng)驗(yàn),函數(shù)嘛無(wú)非就是封裝執(zhí)行一些功能,如有必要的話將結(jié)果通過(guò)返回值返回;而返回值通常會(huì)加以再利用,常見(jiàn)的是賦值給其他變量或者再參與運(yùn)算。
即總覺(jué)得有返回值的函數(shù)調(diào)用都發(fā)生在“=”右邊(即作為右值使用),現(xiàn)在冷不丁放在左邊就蒙了,錯(cuò)就錯(cuò)在這個(gè)慣性思維,忽略了這里是在講引用,現(xiàn)在想來(lái)真是犯了低級(jí)錯(cuò)誤,也片面的理解了左、右值!
概念理解
什么是引用
菜鳥(niǎo)教程 - C++ 引用
引用變量是一個(gè)別名,也就是說(shuō),它是某個(gè)已存在變量的另一個(gè)名字。
一旦把引用初始化為某個(gè)變量,就可以使用該引用名稱或變量名稱來(lái)指向變量。
#include <iostream>
using namespace std;
int main ()
{
// 聲明簡(jiǎn)單的變量
int i;
double d;
// 聲明引用變量
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
}
左值(Lvalues)& 右值(Rvalues)
C++ 中有兩種類型的表達(dá)式:
- 左值(lvalue):指向內(nèi)存位置的表達(dá)式被稱為左值表達(dá)式。
左值可以出現(xiàn)在賦值號(hào)的左邊或右邊。 - 右值(rvalue):術(shù)語(yǔ)右值指的是存儲(chǔ)在內(nèi)存中某些地址的數(shù)值。
右值是不能對(duì)其進(jìn)行賦值的表達(dá)式,也就是說(shuō),右值可以出現(xiàn)在賦值號(hào)的右邊,但不能出現(xiàn)在賦值號(hào)的左邊。
變量是左值,因此可以出現(xiàn)在賦值號(hào)的左邊。
數(shù)值型的字面值是右值,因此不能被賦值,不能出現(xiàn)在賦值號(hào)的左邊,這是一個(gè)有效的語(yǔ)句:int g = 20;
。
但是這個(gè)就不是一個(gè)有效的語(yǔ)句,會(huì)生成編譯時(shí)錯(cuò)誤:10 = 20;
。
其實(shí)這里解釋的已經(jīng)很清楚了,只怪自己當(dāng)初看時(shí)只記住的“左、右值”這么個(gè)概念,而沒(méi)有好好理解其本質(zhì)。
代碼辨析
double& setValues( int i )
{
return vals[i]; // 返回第 i 個(gè)元素的引用
}
setValues(1) = 20.23; // 改變第 2 個(gè)元素
引用作為返回值,返回的相當(dāng)于是一個(gè)變量,當(dāng)然可以作為左值,對(duì)其進(jìn)行賦值操作,這一步就等價(jià)于:
vals[i] = 20.23;
不是多大的問(wèn)題,只怪自己太粗心!