我如何正确 return 来自 C++ 函数的不可修改的对象引用?
How do I correctly return an unmodifiable object reference from function in C++?
我正在尝试从一个函数中 return 一个 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
编辑的对象 return 不允许我修改该对象,但是 const 限定符似乎被删除了?
我是不是做错了,还是有不同的方法来实现这个?
Sprite sprite = entity->GetSprite();
这会创建 Sprite
对象 GetSprite
returns 的副本,使用 `Sprite 的复制构造函数。
编辑副本不应导致修改原件,除非您写错了Sprite
,或者您混淆了引用、值和指针语义。
Sprite const& sprite = entity->GetSprite();
这会获取对包含的 Sprite
的引用,您不能通过它修改它。
如果你想阻止复制 Sprite
s,你可以这样做:
Sprite(Sprite const&) = delete;
但我建议允许移动 Sprite
s:
Sprite(Sprite&&) = default;
尤其是 c++17 之前(当保证省略使其不那么重要时)。
我正在尝试从一个函数中 return 一个 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
编辑的对象 return 不允许我修改该对象,但是 const 限定符似乎被删除了?
我是不是做错了,还是有不同的方法来实现这个?
Sprite sprite = entity->GetSprite();
这会创建 Sprite
对象 GetSprite
returns 的副本,使用 `Sprite 的复制构造函数。
编辑副本不应导致修改原件,除非您写错了Sprite
,或者您混淆了引用、值和指针语义。
Sprite const& sprite = entity->GetSprite();
这会获取对包含的 Sprite
的引用,您不能通过它修改它。
如果你想阻止复制 Sprite
s,你可以这样做:
Sprite(Sprite const&) = delete;
但我建议允许移动 Sprite
s:
Sprite(Sprite&&) = default;
尤其是 c++17 之前(当保证省略使其不那么重要时)。