簡體   English   中英

通過引用 cpp 返回字符串

[英]Returning strings by reference cpp

如果之前有人問過這個問題,請原諒我,我肯定有,但我找不到令我滿意的答案。

我是從沉重的 Java 背景來到 cpp 的,我想了解何時將引用/指針返回到 object 而不是副本。

對於以下 class 定義:

class SpaceShip {
    string name;
    WeaponSystem weaponSystem; //represents some object, this is just an example, I dont have this type of object at all in my program 
    int hull;

    string GetName() const {
       return name;
    }

    WeaponSystem GetWeaponSystem() const {
       return weaponSystem;
    }

    int GetHull() const {
       return hull;
    }
};

我知道返回事物的副本很昂貴,我認為這意味着我想避免按值返回字符串或 weaponSystem 之類的東西,但按值返回 int 是可以的。

這是正確的嗎? 我也知道我需要知道 memory 中的東西在哪里,如果這個 object 被破壞並且某些東西仍然擁有對其名稱的引用,返回對這個 class 中的東西的引用是否意味着危險?

它“有效”,但你應該

const string& GetName() const {

擁有以下內容也可能是有益的

const WeaponSystem& GetWeaponSystem() const {

此外,默認情況下class是私有的,因此,您的訪問器函數是私有的。

關於最后一點,與 Java 相比,C++ 中的資源管理肯定需要更加小心。特別是,您需要決定何時不再需要 object。 通過引用返回具有別名返回的 object 的效果。當您共享的 object 是不可變的時,它並不明顯,但與 Java 的字符串不同,C++ 字符串是可變的。 因此,如果您按值返回name ,然后重命名您的SpaceShip ,即使在重命名之后,調用者也會看到舊名稱。 但是,如果您通過引用返回,調用者將在重命名ShaceShip后立即看到更改。

當您處理復制復雜對象時,您可以通過提供復制構造函數的自定義實現來決定復制多少。 如果您決定提供復制構造函數,請不要忘記三個規則,並覆蓋其他兩個。

你必須知道的是你的 class 的每個吸氣劑都必須是這樣的原型:

const <type> &className::getXXX() const
{
 ...
}

你做的每一個二傳手都是這樣的:

void className::setXXX(const <type> &)
{
 ...
}

盡可能使用參考。 有時,對於復雜的 object,您可以使用指針。 這取決於您的代碼結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM