gpt4 book ai didi

c++ - 如何在不生成拷贝的情况下使用 getter 和 setter?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:26 24 4
gpt4 key购买 nike

我想知道如何为占用大量内存的成员变量使用 getter 和 setter。通常我会这样做:

class A
{
private:
BigObject object;
public:
BigObject getObject() const
{
return object;
}

void setObject(const BigObject& object)
{
this->object = object;
}
};

但是我相信这个 getter 和 setter 会复制我不想要的 BigObject。有更好的方法吗?

我想这样做,但我在网上看到这不是一个好主意,因为如果使用不当会导致段错误:

BigObject& getObject()
{
return object
}

最佳答案

(如果在这种情况下您不关心封装,这意味着 A::object 成员应该可以不受任何限制地被任何人修改,那么请查看 SergeyA's answer )。

通过 const 引用返回以避免复制并仍然保持封装(意味着调用者不能错误地修改成员):

const BigObject& getObject() const
{
return object;
}

如果来电者真的想要一份拷贝,他们自己可以轻松完成。

如果你想在临时对象上使用 getter 时防止悬挂引用(你提到的段错误),你只能在临时对象上实际调用 getter 时返回一个拷贝:

BigObject getObject() const &&
{
return object;
}

const BigObject& getObject() const &
{
return object;
}

这将在临时对象上调用 getObject() 时返回一个拷贝。或者,您可以通过删除特定重载来完全防止临时调用 getter:

BigObject getObject() const && = delete;

const BigObject& getObject() const &
{
return object;
}

请记住,这不是一个有保证的安全网。它可以防止一些错误,但不是全部。函数的调用者仍应了解对象的生命周期。

顺便说一句,您还可以改进您的二传手。现在,无论调用者如何传递参数,它都将始终复制对象。您应该改为按值获取它并将其移动到成员中:

void setObject(BigObject object)
{
this->object = std::move(object);
}

这要求 BigObject 是可移动的。如果不是,那么情况会比以前更糟。

关于c++ - 如何在不生成拷贝的情况下使用 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57515089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com