首頁  >  問答  >  主體

C++ 公有方法返回vector与私有vector不是同一个

黄舟黄舟2714 天前737

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 15:31:27

    回傳vector的值當然不是同一個位址了,回傳的是已經拷貝過了的。
    可以返回指針,const指針。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 15:31:27

    回傳的值,當然是經過拷貝的啦,你不信的話可以改變一下GetcomputerFishes的回傳值,然看看看this->computerFishes的資料是否一致

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 15:31:27

    為什麼地址不一樣?

    GetcomputerFishes函數的回傳值型別是vector<ComputerFish *>,也就是按值回傳;同時回傳語句內的表達式是computerFishes,所以這裡會先拷貝建構一個臨時對象,然後再回傳這個臨時物件(註:由於Copy elision,實際運作時不一定真的會拷貝建構這個臨時物件)。即回傳的物件不是MyClass的成員變量,而是用這個成員變數拷貝建構的一個臨時對象,所以他們的位址不一樣。 (註:按值返回呼叫時的表達式類型是右值,使用者代碼是無法直接取回傳值的位址的,即無法&x.GetcomputerFishes()。但可以將其轉換成左值,然後取位址。)

    如何讓GetcomputerFishes回傳的物件就是computerFishes?

    想要函數傳回MyClass的私有成員computerFishes,可以用按引用回傳。

    vector<ComputerFish *> &GetcomputerFishes() { return computerFishes; }
    const vector<ComputerFish *> &GetcomputerFishes() const { return computerFishes; }
    

    這一組函數重載分別提供對const MyClass物件和非const MyClass物件的支援。

    然後可以用該返回值初始化引用變數(也可以初始化非引用變量,拷貝初始化):

    vector<ComputerFish *> &ref = x.GetcomputerFished();
    ref.clear();
    

    當然也可以透過函數回傳值直接存取:

    x.GetcomputerFished().clear();
    

    回覆
    0
  • 取消回覆