【C++】引用作為返回值,一開(kāi)始我沒(méi)看懂

菜鳥(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)題,只怪自己太粗心!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容