欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何理解C++ 臨時(shí)變量的常量性

 更新時(shí)間:2020年08月24日 09:54:13   作者:Dabelv  
這篇文章主要介紹了如何理解C++ 臨時(shí)變量的常量性,幫助大家更好的理解和學(xué)習(xí)c++ 變量,感興趣的朋友可以了解下

1.認(rèn)識(shí)臨時(shí)變量的常量性

關(guān)于臨時(shí)變量的常量性,先看一段代碼。

void print(string& str)
{
	cout<<str<<endl;
}
//如此調(diào)用會(huì)報(bào)編譯錯(cuò)誤
print("hello world");

在Linux環(huán)境使用g++編譯,會(huì)出現(xiàn): invalid initialization of non-const reference of type ‘std::string&' from a temporary of type 'std::string'的錯(cuò)誤。其中文意思為臨時(shí)變量無法為非const引用初始化。出錯(cuò)的原因是編譯器根據(jù)字符串"hello world"構(gòu)造一個(gè)string類型的臨時(shí)對象,這個(gè)臨時(shí)變量具有const屬性,當(dāng)這個(gè)臨時(shí)變量傳遞給非const的string&引用類型時(shí),無法隱式完成const到非const的類型轉(zhuǎn)換,便出現(xiàn)上面的編譯錯(cuò)誤。解決辦法是將print()函數(shù)的參數(shù)改為常引用。代碼修改如下,可順利通過編譯。

void print(const string& str)
{
	cout<<str<<endl;
}
//順利通過編譯
print("hello world");

通過以上代碼,可以看出在設(shè)計(jì)函數(shù)時(shí),形參盡可能地使用const,這樣可以使代碼更為健壯,將錯(cuò)誤暴露于編譯階段。

2.臨時(shí)變量常量性的原因

為什么臨時(shí)對象作為引用參數(shù)傳遞時(shí),形參必須是常量引用呢?很多人對此的解釋是臨時(shí)變量是常量,不允許賦值改動(dòng),所以作為非常量引用傳遞時(shí),編譯器就會(huì)報(bào)錯(cuò)。這個(gè)解釋在理解臨時(shí)變量不能作為非const引用參數(shù)這個(gè)問題上是可以的,但不夠準(zhǔn)確。事實(shí)上,臨時(shí)變量是可以作為左值(Lvalue) 并被賦值的,請看下面的代碼:

class IntClass
{
private:
	int x;
public:
	IntClass(int value):x(value){}
	friend ostream& operator<<(ostream &os, const IntClass &intc);
};

//重載operator<<
ostream& operator<<(ostream &os, const IntClass &intc)
{
	os<<intc.x;
	return os;
}

int main(int argc,char* argv[])
{
	cout << (IntClass(6) = IntClass(8))<<endl;
}

程序輸出:

8

以上代碼正確編譯運(yùn)行,沒有錯(cuò)誤。IntClass(6)表示生成一個(gè)無名臨時(shí)變量并作為左值被修改,所以臨時(shí)變量并不是常量,只是編譯器從語義層面限制了臨時(shí)變量傳遞給非const引用。注意,這里與《C++編程思想》在第八章中的“臨時(shí)量”小節(jié)中認(rèn)為“編譯器使所有的臨時(shí)量自動(dòng)設(shè)為const”的說法有些不同。

那編譯器為何作出如此限制呢?如果一個(gè)實(shí)參以非const引用傳入函數(shù),編譯器有理由認(rèn)為該實(shí)參會(huì)在函數(shù)中被修改,并且這個(gè)被修改的引用在函數(shù)返回后要發(fā)揮作用。但如果把一個(gè)臨時(shí)變量當(dāng)作非const引用參數(shù)傳進(jìn)來,由于臨時(shí)變量的特殊性,臨時(shí)變量所在的表達(dá)式執(zhí)行結(jié)束后,臨時(shí)變量就會(huì)被釋放,所以,一般說來, 修改一個(gè)臨時(shí)變量是毫無意義的,據(jù)此,C++編譯器加入了臨時(shí)變量不能作為非const引用實(shí)參這個(gè)語義限制,意在限制這個(gè)非常規(guī)用法的潛在錯(cuò)誤。

以上就是如何理解C++ 臨時(shí)變量的常量性的詳細(xì)內(nèi)容,更多關(guān)于C++ 臨時(shí)變量的常量性的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實(shí)現(xiàn)簡單電子通訊錄(2)

    C語言實(shí)現(xiàn)簡單電子通訊錄(2)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單電子通訊錄的第二部分,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn)

    C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn)

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)softmax函數(shù)的面試經(jīng)驗(yàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • c++使用regex報(bào)錯(cuò)regex_error兩種解決方案

    c++使用regex報(bào)錯(cuò)regex_error兩種解決方案

    C++正則表達(dá)式是一個(gè)非常強(qiáng)大和實(shí)用的工具,但是使用它們時(shí)需要注意仔細(xì)檢查代碼是否符合語法規(guī)則,這篇文章主要給大家介紹了關(guān)于c++使用regex報(bào)錯(cuò)regex_error的兩種解決方案,需要的朋友可以參考下
    2024-03-03
  • 代碼講解C++繼承和派生

    代碼講解C++繼承和派生

    在本文中我們通過實(shí)例代碼給大家講解下C++繼承和派生相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-02-02
  • C指針原理教程之Ncurses介紹

    C指針原理教程之Ncurses介紹

    Ncurses 提供字符終端處理庫,包括面板和菜單。為了能夠使用ncurses庫,您必須在您的源程序中將curses.h包括(include)進(jìn)來,而且在編譯的需要與它連接起來. 在gcc中您可以使用參數(shù)-lcurses進(jìn)行編譯.
    2019-02-02
  • 如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split詳解

    如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split詳解

    這篇文章主要給大家介紹了關(guān)于如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解析C++編程中的#include和條件編譯

    解析C++編程中的#include和條件編譯

    這篇文章主要介紹了解析C++編程中的#include和條件編譯,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實(shí)現(xiàn)頁面置換 先進(jìn)先出算法(FIFO)

    C語言實(shí)現(xiàn)頁面置換 先進(jìn)先出算法(FIFO)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)頁面置換,先進(jìn)先出算法(FIFO),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++簡明講解缺省參數(shù)與函數(shù)重載的用法

    C++簡明講解缺省參數(shù)與函數(shù)重載的用法

    所謂缺省參數(shù),顧名思義,就是在聲明函數(shù)的某個(gè)參數(shù)的時(shí)候?yàn)橹付ㄒ粋€(gè)默認(rèn)值,在調(diào)用該函數(shù)的時(shí)候如果采用該默認(rèn)值,你就無須指定該參數(shù)。C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載,借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-06-06

最新評論