请原谅我,如果之前有人询问过,我相信它有,但我找不到我满意的答案。
我是从一个繁重的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是可以的。
这是对的吗?我也知道我需要知道内存中存在的东西,如果这个对象被破坏并且某些东西仍然拥有对它名称的引用,那么返回对这个类中某些东西的引用意味着危险吗?
答案 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> &)
{
...
}
尽可能使用参考。 有时,对于复杂的对象,您可以使用指针。这取决于您的代码结构。