通过引用cpp返回字符串

时间:2012-04-08 20:27:46

标签: c++ pass-by-reference

请原谅我,如果之前有人询问过,我相信它有,但我找不到我满意的答案。

我是从一个繁重的Java背景来到cpp,并希望了解何时返回一个对象而不是副本的引用/指针。

用于以下类定义:

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;
    }
};

我知道返回一个东西的副本很昂贵,我认为这意味着我想避免按值返回类似字符串或武器系统的东西,但是按值的int是可以的。

这是对的吗?我也知道我需要知道内存中存在的东西,如果这个对象被破坏并且某些东西仍然拥有对它名称的引用,那么返回对这个类中某些东西的引用意味着危险吗?

3 个答案:

答案 0 :(得分:0)

它“有效”,但你应该

const string& GetName() const {

同样具有以下内容也可能是有益的

const WeaponSystem& GetWeaponSystem() const {

此外,默认情况下class是私有的,因此,您的访问者功能是私有的。

答案 1 :(得分:0)

关于你的最后一点,你肯定需要在C ++中比在Java中更加小心资源管理。特别是,您需要决定何时不再需要对象。通过引用返回具有别名到返回对象的效果。当您共享的对象是不可变的时,这是不明显的,但与Java的字符串不同,C ++字符串是可变的。因此,如果您按值返回name,然后重命名SpaceShip,则即使重命名后,调用者也会看到旧名称。但是,如果您通过引用返回,则只要重命名ShaceShip,调用者就会看到更改。

处理复制对象时,可以通过提供复制构造函数的自定义实现来决定复制多少。如果您决定提供复制构造函数,请不要忘记the rule of three,并覆盖其他两个。

答案 2 :(得分:0)

你必须知道的是,你班上的每个吸气者都必须是这样的原型:

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

你做的每个人都是这样的:

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

尽可能使用参考。 有时,对于复杂的对象,您可以使用指针。这取决于您的代码结构。