C++ 類this及返回自身對(duì)象的引用方式
this及返回自身對(duì)象的引用
this:調(diào)用成員函數(shù)的時(shí)候,編譯器負(fù)責(zé)把對(duì)象地址傳(&myTime)遞給成員函數(shù)中隱藏的this形參。
在系統(tǒng)角度來(lái)看,任何對(duì)類成員的直接訪問(wèn)都是被this隱式調(diào)用的。
- this有個(gè)const修飾符,只能用來(lái)指向已確定的那個(gè)對(duì)象,不能更改。
- this只能在成員函數(shù)中使用,全局函數(shù)靜態(tài)函數(shù)不能使用this。
- 在成員普通函數(shù)中,this是一個(gè)指向非const對(duì)象的const指針。(this 等價(jià)于 Time *const this,const修飾this,this不能指向其他對(duì)象,但this指向的對(duì)象中的成變量可以被修改。)
- 在const成員函數(shù)中,this指針是一個(gè)指向const對(duì)象的const指針(this 等價(jià)于 const Time * const this)。
class Time { public: ?? ?int hour; ?? ?int minute; public: ?? ?//把對(duì)象自己返回去了 ?? ?Time& add_hour(int temp_hour); ?? ?Time& add_minute(int minute); };
//實(shí)際工作中,this能省則省。 Time& Time::add_hour(int temphour) ?{ ?? ?this->hour += temphour;//等價(jià)于 hour += temphour; ?? ?return *this;//把對(duì)象自己返回去了,固定寫(xiě)法。指向本對(duì)象的指針。*this表示對(duì)象本身。 } Time& Time::add_minute(int minute) { ?? ?this->minute += minute;//區(qū)分成員變量和形參 ? ? return *this; }
?? ?Time myTime; ?? ?myTime.add_hour(3); ?? ?myTime.add_hour(3).add_minute(10);//返回自己,可以連續(xù)調(diào)用。
c++如何返回對(duì)象
返回對(duì)象,無(wú)非兩種方式,返回棧對(duì)象和堆對(duì)象指針,棧對(duì)象指針不能返回,因?yàn)榭赡苁褂貌辉撌褂玫膬?nèi)存,堆對(duì)象也不能直接返回,因?yàn)闀?huì)產(chǎn)生內(nèi)存泄漏。下面,我們分析兩種返回方式的優(yōu)缺點(diǎn),及針對(duì)缺點(diǎn)的解決方案。
這里有個(gè)注意點(diǎn),返回this指針指向的自身對(duì)象時(shí),可以返回引用。
返回棧對(duì)象
- 優(yōu)點(diǎn):不用手動(dòng)釋放內(nèi)存,避免了內(nèi)存泄漏;
- 缺點(diǎn):會(huì)產(chǎn)生對(duì)象拷貝,如果對(duì)象比較大,比如,對(duì)象里面有大數(shù)組,會(huì)產(chǎn)生性能開(kāi)銷。
返回堆對(duì)象指針
- 優(yōu)點(diǎn):不會(huì)產(chǎn)生對(duì)象拷貝,對(duì)性能友好;
- 缺點(diǎn):函數(shù)調(diào)用之后手動(dòng)釋放對(duì)象,代碼管理難度和內(nèi)存泄漏風(fēng)險(xiǎn)提高。
那有沒(méi)有辦法,把上面的缺點(diǎn)全克服了呢?有!
- 返回棧對(duì)象:用移動(dòng)構(gòu)造函數(shù)減少大對(duì)象拷貝;
- 返回堆指針:借助智能指針,避免內(nèi)存泄漏。
注意:返回棧對(duì)象時(shí),雖然很多編譯器做了編譯優(yōu)化,即使不寫(xiě)移動(dòng)構(gòu)造函數(shù),也不會(huì)產(chǎn)生對(duì)象拷貝,但是,為了應(yīng)對(duì)還沒(méi)有編譯優(yōu)化的編譯器,建議寫(xiě)好移動(dòng)構(gòu)造函數(shù)。
可以看下面代碼。
#include <iostream> using namespace std; class A{ public: int i; string* bigObj; //假設(shè)這是大對(duì)象 A(){ bigObj=new string("abc"); cout<<"A created."<<endl; } ~A(){ if(bigObj!=nullptr){ delete bigObj; bigObj=nullptr; } cout<<"A delete."<<endl; } A(const A &a):i(a.i),bigObj(new string(*(a.bigObj))){ cout<<"A copied."<<endl; } //建議在類里面寫(xiě)好移動(dòng)構(gòu)造函數(shù),解決返回對(duì)象時(shí)對(duì)象拷貝帶來(lái)的性能開(kāi)銷。 A(A&& a):i(a.i),bigObj(a.bigObj){ a.bigObj=nullptr; cout<<"A moved."<<endl; } }; //如果沒(méi)有編譯器優(yōu)化,如果沒(méi)有移動(dòng)構(gòu)造函數(shù),這種寫(xiě)法調(diào)用拷貝構(gòu)造函數(shù),產(chǎn)生對(duì)象復(fù)制 A GetAInstance1(){ A a; return a; } //這種寫(xiě)法運(yùn)行沒(méi)問(wèn)題,但是要在函數(shù)調(diào)用之后手動(dòng)釋放對(duì)象, //代碼管理難度和內(nèi)存泄漏風(fēng)險(xiǎn)提高。 A* GetAInstance2(){ A* a=new A; return a; } //這種寫(xiě)法沒(méi)問(wèn)題 unique_ptr<A> GetAInstance3(){ unique_ptr<A> a(new A); return a; } //這樣返回會(huì)造成內(nèi)存泄漏 A GetAInstance4(){ A* a=new A; //此處的a無(wú)法釋放 return *a; } //這樣返回會(huì)使用不該使用的內(nèi)存,造成程序運(yùn)行不穩(wěn)定 A* GetAInstance5(){ A a; return &a; } int main(int argc, const char * argv[]) { A a1=GetAInstance1(); cout<<"-----------------"<<endl; A* a2=GetAInstance2(); delete a2; cout<<"-----------------"<<endl; unique_ptr<A> a3=GetAInstance3(); cout<<"Main Over"<<endl; return 0; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決
本文主要介紹了C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn),需要的朋友可以參考下2014-07-07C語(yǔ)言中system()執(zhí)行cmd命令打開(kāi)關(guān)閉程序的方法
今天小編就為大家分享一篇C語(yǔ)言中system()執(zhí)行cmd命令打開(kāi)關(guān)閉程序的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05QT中QColorDialog開(kāi)發(fā)實(shí)例
QColorDialog是Qt框架中用于選擇顏色的對(duì)話框類,本文主要介紹了QT中QColorDialog開(kāi)發(fā)實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)字符串單詞數(shù)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)統(tǒng)計(jì)字符串單詞數(shù),代碼非常的簡(jiǎn)潔,有需要的小伙伴快來(lái)參考下。2015-03-03OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單)
這篇文章主要介紹了OpenCV4.1.0+VisualStudio2019開(kāi)發(fā)環(huán)境搭建(超級(jí)簡(jiǎn)單),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C++命名空間?缺省參數(shù)?const總結(jié)?引用總結(jié)?內(nèi)聯(lián)函數(shù)?auto關(guān)鍵字詳解
這篇文章主要介紹了C++命名空間?缺省參數(shù)?const總結(jié)?引用總結(jié)?內(nèi)聯(lián)函數(shù)?auto關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下2023-01-01C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬(wàn)敵下篇
在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活2022-02-02