日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++?類this及返回自身對象的引用方式_C 語言

作者:猿六凱 ? 更新時間: 2022-12-07 編程語言

this及返回自身對象的引用

this:調用成員函數的時候,編譯器負責把對象地址傳(&myTime)遞給成員函數中隱藏的this形參。

在系統角度來看,任何對類成員的直接訪問都是被this隱式調用的。

  • this有個const修飾符,只能用來指向已確定的那個對象,不能更改。
  • this只能在成員函數中使用,全局函數靜態函數不能使用this。
  • 在成員普通函數中,this是一個指向非const對象的const指針。(this 等價于 Time *const this,const修飾this,this不能指向其他對象,但this指向的對象中的成變量可以被修改。)
  • 在const成員函數中,this指針是一個指向const對象的const指針(this 等價于 const Time * const this)。
class Time {
public:
?? ?int hour;
?? ?int minute;
public:
?? ?//把對象自己返回去了
?? ?Time& add_hour(int temp_hour);
?? ?Time& add_minute(int minute);
};
//實際工作中,this能省則省。
Time& Time::add_hour(int temphour) ?{
?? ?this->hour += temphour;//等價于 hour += temphour;
?? ?return *this;//把對象自己返回去了,固定寫法。指向本對象的指針。*this表示對象本身。
}
Time& Time::add_minute(int minute) {
?? ?this->minute += minute;//區分成員變量和形參
? ? return *this;
}
?? ?Time myTime;
?? ?myTime.add_hour(3);
?? ?myTime.add_hour(3).add_minute(10);//返回自己,可以連續調用。

c++如何返回對象

返回對象,無非兩種方式,返回棧對象和堆對象指針,棧對象指針不能返回,因為可能使用不該使用的內存,堆對象也不能直接返回,因為會產生內存泄漏。下面,我們分析兩種返回方式的優缺點,及針對缺點的解決方案。

這里有個注意點,返回this指針指向的自身對象時,可以返回引用。

返回棧對象

  • 優點:不用手動釋放內存,避免了內存泄漏;
  • 缺點:會產生對象拷貝,如果對象比較大,比如,對象里面有大數組,會產生性能開銷。

返回堆對象指針

  • 優點:不會產生對象拷貝,對性能友好;
  • 缺點:函數調用之后手動釋放對象,代碼管理難度和內存泄漏風險提高。

那有沒有辦法,把上面的缺點全克服了呢?有!

  • 返回棧對象:用移動構造函數減少大對象拷貝;
  • 返回堆指針:借助智能指針,避免內存泄漏。

注意:返回棧對象時,雖然很多編譯器做了編譯優化,即使不寫移動構造函數,也不會產生對象拷貝,但是,為了應對還沒有編譯優化的編譯器,建議寫好移動構造函數。

可以看下面代碼。

#include <iostream>
 
using namespace std;
class A{
public:
    int i;
    string* bigObj; //假設這是大對象
    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;
    }
    //建議在類里面寫好移動構造函數,解決返回對象時對象拷貝帶來的性能開銷。
    A(A&& a):i(a.i),bigObj(a.bigObj){
        a.bigObj=nullptr;
        cout<<"A moved."<<endl;
    }
};
 
//如果沒有編譯器優化,如果沒有移動構造函數,這種寫法調用拷貝構造函數,產生對象復制
A GetAInstance1(){
    A a;
    return a;
}
 
//這種寫法運行沒問題,但是要在函數調用之后手動釋放對象,
//代碼管理難度和內存泄漏風險提高。
A* GetAInstance2(){
    A* a=new A;
    return a;
}
 
//這種寫法沒問題
unique_ptr<A> GetAInstance3(){
    unique_ptr<A> a(new A);
    return a;
}
 
//這樣返回會造成內存泄漏
A GetAInstance4(){
    A* a=new A;  //此處的a無法釋放
    return *a;
}
 
//這樣返回會使用不該使用的內存,造成程序運行不穩定
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;
}

原文鏈接:https://blog.csdn.net/u014339447/article/details/109496593

欄目分類
最近更新