首页 > 解决方案 > 如何从 C++ 中的函数正确返回不可修改的对象引用?

问题描述

我正在尝试从函数返回一个 const 对象,以便我可以从中获取信息,但是一旦创建它就不能更改任何内容。我有以下代码

    Sprite const& GetSprite() const {
        return *m_sprite;
    }


    std::unique_ptr<Sprite> m_sprite;
    int test = 5;

我在代码中的其他地方调用了这个GetSprite函数

Sprite sprite = entity->GetSprite();
sprite.test = 6;

这似乎编译得很好,并且在单步执行后test实际上更改了值。我会假设从返回的对象GetSprite不允许我修改对象,但是 const 限定符似乎被删除了?

我做错了还是有不同的方法来实现这一点?

标签: c++constantspass-by-reference

解决方案


Sprite sprite = entity->GetSprite();

这将创建Sprite对象GetSprite返回的副本,使用 `Sprite.

编辑副本不应导致修改原始内容,除非您Sprite写错了,或者您对引用、值和指针语义感到困惑。

Sprite const& sprite = entity->GetSprite();

这获得了对包含的引用Sprite,您不能通过它修改它。

如果你想阻止复制Sprites,你可以这样做:

Sprite(Sprite const&) = delete;

但我建议允许移动Sprites:

Sprite(Sprite&&) = default;

尤其是之前(当保证省略使其不那么重要时)。


推荐阅读