課程
/后端開發(fā)
/C++
/C++遠(yuǎn)征之封裝篇(下)
Array& printinfo()
{
return *this;
} ? ??
為什么要用Array&,直接返回Array不行么
2015-10-17
源自:C++遠(yuǎn)征之封裝篇(下) 4-8
正在回答
可以直接返回Array,但這樣并不好。
&這表明返回的是array引用。
類成員函數(shù)有時(shí)打算返回類實(shí)例自身,就會(huì)返回*this的引用。
而有時(shí)并不一定需要返回自身,但仍會(huì)選擇返回引用,原因如下:
函數(shù)在返回值的時(shí)候,是先用你要返回的變量去構(gòu)造一個(gè)臨時(shí)變量,再將這個(gè)臨時(shí)變量返回給接受返回值的調(diào)用者。在調(diào)用者使用過后,這個(gè)臨時(shí)變量再被自動(dòng)銷毀。
如果返回的是一個(gè)很大的類實(shí)例的話,構(gòu)造這個(gè)臨時(shí)變量會(huì)調(diào)用拷貝構(gòu)造函數(shù),這可能造成很大的運(yùn)行開銷(例子中的情況下array會(huì)被整個(gè)復(fù)制一遍)。為了減少這種負(fù)面影響,在一些情況下會(huì)選擇返回引用類型。注意:這不會(huì)改變函數(shù)返回時(shí)的行為,即——還是會(huì)將這個(gè)引用臨時(shí)復(fù)制一份——但復(fù)制引用類型的開銷基本上可以忽略不計(jì)。
但需要萬分注意:返回引用類型時(shí)必須要保證被引用的變量要在函數(shù)退出后仍存在(不然返回的那個(gè)引用指向誰呢?!) ?當(dāng)然這個(gè)代碼中這樣用沒有問題,因?yàn)樵谡{(diào)用過后 arr1 肯定還是存在的。
P.S. 較新的C++11標(biāo)準(zhǔn)中增加了“右值引用”特性,很好地解決了函數(shù)返回時(shí)臨時(shí)變量的麻煩。
onemoo
qq_賽塞澀_0 提問者
培根熏肉
onemoo 回復(fù) 培根熏肉
作為一個(gè)菜鳥,樓上各位大師說的不太懂,所以寫出來自己的理解幫助其他菜鳥理解。如果有錯(cuò),請大神瘋狂地噴吧。正文如下:
arr1.printInfo().setlen(10);
上面的語句連用兩個(gè)點(diǎn)號(hào),第一個(gè)點(diǎn)好理解,即調(diào)用實(shí)例化的對(duì)象arr1里的printInfo函數(shù)。第二個(gè)呢?我們看頭文件中的定義(先寫出來沒有&符號(hào)的):
Array printInfo();
這個(gè)語句呢,相當(dāng)于實(shí)例化Array類的另外一個(gè)對(duì)象名字叫做printInfo()。所以,第二個(gè)點(diǎn)號(hào)后的setlen相當(dāng)于調(diào)用printinfo這個(gè)對(duì)象里的setlen函數(shù)。所以setlen(10)只是對(duì)printinfo中的len值進(jìn)行了改變,并不會(huì)影響到arr1的len值(注意printinfo雖然是實(shí)例化的一個(gè)對(duì)象,但它又是arr1這個(gè)對(duì)象的成員)。修改如下:
Array& printInfo();
這時(shí),返回值為引用類型,即函數(shù)printinfo返回值為一個(gè)對(duì)象的引用,也就是arr1的引用。所以此時(shí)再調(diào)用printinfo的setlen當(dāng)然就會(huì)改變arr1的len值(printinfo成為了arr1的別名)。
自己的理解怪怪的,畢竟作為一個(gè)機(jī)械專業(yè)的學(xué)生。
&引用之后可以對(duì)該對(duì)象進(jìn)行操作(修改len值等)。Array只是臨時(shí)變量,不能對(duì)原來的對(duì)象進(jìn)行修改。
舉報(bào)
封裝--面向?qū)ο笕筇卣髦唬ㄟ^案例讓C++所學(xué)知識(shí)融會(huì)貫通
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2015-10-18
可以直接返回Array,但這樣并不好。
&這表明返回的是array引用。
類成員函數(shù)有時(shí)打算返回類實(shí)例自身,就會(huì)返回*this的引用。
而有時(shí)并不一定需要返回自身,但仍會(huì)選擇返回引用,原因如下:
函數(shù)在返回值的時(shí)候,是先用你要返回的變量去構(gòu)造一個(gè)臨時(shí)變量,再將這個(gè)臨時(shí)變量返回給接受返回值的調(diào)用者。在調(diào)用者使用過后,這個(gè)臨時(shí)變量再被自動(dòng)銷毀。
如果返回的是一個(gè)很大的類實(shí)例的話,構(gòu)造這個(gè)臨時(shí)變量會(huì)調(diào)用拷貝構(gòu)造函數(shù),這可能造成很大的運(yùn)行開銷(例子中的情況下array會(huì)被整個(gè)復(fù)制一遍)。為了減少這種負(fù)面影響,在一些情況下會(huì)選擇返回引用類型。注意:這不會(huì)改變函數(shù)返回時(shí)的行為,即——還是會(huì)將這個(gè)引用臨時(shí)復(fù)制一份——但復(fù)制引用類型的開銷基本上可以忽略不計(jì)。
但需要萬分注意:返回引用類型時(shí)必須要保證被引用的變量要在函數(shù)退出后仍存在(不然返回的那個(gè)引用指向誰呢?!) ?當(dāng)然這個(gè)代碼中這樣用沒有問題,因?yàn)樵谡{(diào)用過后 arr1 肯定還是存在的。
P.S. 較新的C++11標(biāo)準(zhǔn)中增加了“右值引用”特性,很好地解決了函數(shù)返回時(shí)臨時(shí)變量的麻煩。
2016-01-09
作為一個(gè)菜鳥,樓上各位大師說的不太懂,所以寫出來自己的理解幫助其他菜鳥理解。如果有錯(cuò),請大神瘋狂地噴吧。正文如下:
arr1.printInfo().setlen(10);
上面的語句連用兩個(gè)點(diǎn)號(hào),第一個(gè)點(diǎn)好理解,即調(diào)用實(shí)例化的對(duì)象arr1里的printInfo函數(shù)。第二個(gè)呢?我們看頭文件中的定義(先寫出來沒有&符號(hào)的):
Array printInfo();
這個(gè)語句呢,相當(dāng)于實(shí)例化Array類的另外一個(gè)對(duì)象名字叫做printInfo()。所以,第二個(gè)點(diǎn)號(hào)后的setlen相當(dāng)于調(diào)用printinfo這個(gè)對(duì)象里的setlen函數(shù)。所以setlen(10)只是對(duì)printinfo中的len值進(jìn)行了改變,并不會(huì)影響到arr1的len值(注意printinfo雖然是實(shí)例化的一個(gè)對(duì)象,但它又是arr1這個(gè)對(duì)象的成員)。修改如下:
Array& printInfo();
這時(shí),返回值為引用類型,即函數(shù)printinfo返回值為一個(gè)對(duì)象的引用,也就是arr1的引用。所以此時(shí)再調(diào)用printinfo的setlen當(dāng)然就會(huì)改變arr1的len值(printinfo成為了arr1的別名)。
自己的理解怪怪的,畢竟作為一個(gè)機(jī)械專業(yè)的學(xué)生。
2015-12-10
&引用之后可以對(duì)該對(duì)象進(jìn)行操作(修改len值等)。Array只是臨時(shí)變量,不能對(duì)原來的對(duì)象進(jìn)行修改。