關於非常量引用的初始值必須為左值的問題


首先 我現在編寫一個代碼時出現了一個問題代碼如下

Spritestone& Monster::getValue()
{
    int stoneCount[] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
    int value = stoneCount[level - 1];

    return SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL);
}

就是Monster對象中有一個getValue方法用Spritestone(靈石)來估計Monster的價值,返回值是Spritestone的引用,在函數內部我的返回值是用SpriteStone的構造函數狗構造出的一個對象,但是代碼卻報錯提示:非常量引用的初始值必須為左值,仔細一看原來是函數返回值是一個類的引用的問題,下面總結如下:

 

首先了解一個東西叫做左值與右值。

所謂左值,就是C/C++中可以放在賦值符號左邊的變量,表示存儲在內存的對象,相當於地址值,而右值則是當一個符號或者常量放在操作符右邊的時候,計算機就讀他們的右值也就是他們的真實值。簡言之,左值就是地址值,而右值就是真實值。

 

然后要明白一點我們在定義一個東西的引用時,這個東西只能是常量而不能是常量,比方說有這樣的代碼

int& a = 1;
    a = 2

這顯然是不合理的,因為如果允許使用常量作為左值的話,改變了a的值,同時1的值也要修改,這是錯誤的。

 

再來看 上邊最開始的代碼,函數要求返回值的類型是返回值是Spritestone的引用,而我在函數的末尾返回了

SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL),而這個東西是個臨時變量,他的生命周期在函數結束后就要結束了,如果返回一個引用,后面如果改變引用的值得話,那是不是這個臨時變量也要改變呢,顯然不合理,自然會報錯,非常量引用的初始值必須為左值,因此,解決方案是,將函數的返回值由Spritestone的引用
改為SpriteStone即可:
SpriteStone Monster::getValue()
{
    int stoneCount[] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
    int value = stoneCount[level - 1];
    return SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM