-
被定義為常對(duì)象的函數(shù)才能調(diào)用常成員函數(shù)
查看全部 -
!!!Array?
return *this;
返回的是一個(gè)臨時(shí)的新對(duì)象,之后對(duì)返回值的操作,不會(huì)影響到this原本指向的對(duì)象。
但是!
Array&?
return *this;
引用符號(hào)&的引入可以改變?cè)璽his指向的對(duì)象.
查看全部 -
Coordinate coord[3]: 棧的實(shí)例化方式,用"."調(diào)用;
Coordinate *p = new Coordinate[3]: 堆的實(shí)例化方式,用"p[]."或"p->"調(diào)用,一定要delete配套銷毀delete []p
查看全部 -
Array&??printInfo() {
????return?*this;????//沒有“&”,返回的是一個(gè)臨時(shí)對(duì)象
}
return *this返回的是當(dāng)前對(duì)象的克隆或者本身(若返回類型為A, 則是克隆, 若返回類型為A&, 則是本身的引用 )
查看全部 -
兩種實(shí)例化用法
查看全部 -
動(dòng)畫控制函數(shù)
查看全部 -
為什么要用Array&呀
Array& printinfo()
{
return *this;
} ? ??
為什么要用Array&,直接返回Array不行么
2015-10-17源自:C++遠(yuǎn)征之封裝篇(下) 4-8845 瀏覽3 回答
最佳回答
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í)變量的麻煩。
+3積分什么是積分?
舉報(bào)?回復(fù)??5
續(xù)上,沒看完整個(gè)視頻,回答得不準(zhǔn)確。 看到視頻中在調(diào)用過?printinfo?函數(shù)后,緊接著又調(diào)用了?setLen。 那么如果是直接返回Array,則調(diào)用setLen是調(diào)用那個(gè)臨時(shí)變量的setLen,也就是改變的是臨時(shí)變量的len。?arr1的len不會(huì)有任何改變。 既然目的是要返回類實(shí)例自身,就更要將返回類型聲明為引用了。
#12015-10-18?回復(fù)?舉報(bào)
查看全部 -
C語言中malloc知識(shí)單純的分配內(nèi)存空間,而new不但會(huì)分配內(nèi)存空間,還會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)
查看全部 -
走迷宮案例:
左手原則:想象自己在家左手扶著墻一直走。
右手原則:想象自己在家右手扶著墻一直走。
要建立兩個(gè)類,迷宮類和人
成就感源于克服困難
查看全部 -
對(duì)象的引用與對(duì)象的指針。
對(duì)象的常指針與常引用
查看全部 -
重要,返回引用查看全部
-
未做筆記i
查看全部 -
一個(gè)對(duì)象中包含其他對(duì)象:對(duì)象成員
至少定義兩個(gè)類,一個(gè)定義點(diǎn),一個(gè)定義線段。
點(diǎn)的定義:
線段的定義:其中包括兩個(gè)點(diǎn)
實(shí)例化一條線段:先實(shí)例化A這個(gè)坐標(biāo)點(diǎn),再實(shí)例化B這個(gè)坐標(biāo)點(diǎn),最后實(shí)例化Line,銷毀過程與實(shí)例化過程正好相反。
但坐標(biāo)點(diǎn)類的構(gòu)造函數(shù)應(yīng)該需要參數(shù):
利用初始化列表:
查看全部 -
delete []p;執(zhí)行了三次析構(gòu)函數(shù)
若不加[],則只執(zhí)行一次析構(gòu)函數(shù)
查看全部 -
//demo.cpp #include?<iostream> #include?<stdlib.h> #include?<Coordinate.h> using?namespace?std; int?main(void){ ????Coordinate?coor[3];//從棧 ????coor[0].m_iX?=?3; ????coor[0].m_iY?=?5; ????Coordinate?*p?=?new?Coordinate[3];//從堆中 ????p->m_iX?=?7; ????p[0].m_iY?=?9;//這樣寫不要用->,用點(diǎn)號(hào) ????p++;//p?=?p?+?1;指向了第二個(gè)元素 ????p->m_iX?=?11; ????p[0].m_iY?=?12;//此時(shí)訪問到的是第二個(gè)元素 ????p[1].m_iX?=?15;//第三個(gè)元素 ????p++; ????p->m_iY?=?17; ????//遍歷對(duì)象數(shù)組 ????for(int?i?=?0;?i<?3;i++){ ????????cout?<<?"coor_x"<<coor[i].m_iX?<<?endl; ????????cout?<<?"coor_x"?<<?coor[i].m_iY?<<?endl; ????} ????for(int?j?=?0;j?<?3;j++){//區(qū)分j和p[]的作用 ????????cout?<<?"p_x"?<<?p->m_iX?<<?endl; ????????cout?<<?"p_y"?<<?p->m_iY?<<?endl; ????????p--; ????} ????//注意理解 ????p++; ????delete?[]p; ????p?=?NULL; ????system("pause"); ????return?0; }
查看全部
舉報(bào)