[英]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.