1

如果之前有人问过这个问题,请原谅我,我确信它已经问过了,但我找不到满意的答案。

我从沉重的 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 是可以的。

这是正确的吗?我也知道我需要知道事物在内存中的位置,如果该对象被破坏并且某些事物仍然拥有对其名称的引用,那么返回对此类中某些事物的引用是否意味着危险?

4

3 回答 3

0

它“有效”,但你应该有

const string& GetName() const {

拥有以下内容也可能是有益的

const WeaponSystem& GetWeaponSystem() const {

此外,class默认情况下是私有的,因此,您的访问器函数是私有的。

于 2012-04-08T20:30:39.103 回答
0

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

当您处理复制复杂对象时,您可以通过提供复制构造函数的自定义实现来决定复制多少。如果您决定提供一个复制构造函数,请不要忘记三个规则,并覆盖另外两个。

于 2012-04-08T20:39:09.153 回答
0

您必须知道的是,您班级的每个吸气剂都必须是这样的原型:

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

以及您这样制作的每个二传手:

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

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

于 2015-05-16T15:06:56.990 回答