【发布时间】:2014-12-19 02:17:59
【问题描述】:
我在 C++11 中遇到了一个关于 const 正确性的小问题,我希望我能得到澄清——我认为还没有被问到!
假设我们有一个类 A,它包含我们想要公开的类 B 的一个实例。如果我们将它作为参考公开,我们将提供 getter 的 const 和非 const 版本:
class B;
class A final
{
public:
B& GetB()
{
return m_b;
}
const B& GetB() const
{
return m_b;
}
private:
B m_b;
};
但是,如果我们只有一个指向 B 的指针,我们将提供一个 const 的 getter,但返回指向 B 的非 const 实例的指针的副本。这是因为 A 不拥有 B,它只拥有指针,因此对 B 的外部修改不会改变 A 的状态。(注意:我从个人经验得出这个结论;我从未发现任何明确说明这应该如何工作的东西)
class B;
class A final
{
public:
A(B* b)
{
m_b = b;
}
A* GetB() const
{
return m_b;
}
private:
B* m_b;
};
到目前为止,这一切都说得通,但是如果 A 拥有指向 B 的唯一指针(或共享指针),我们该怎么办? A 现在逻辑上拥有 B——即使不是字面上的。到目前为止,在将原始指针暴露给共享指针时,我一直在遵循上面的第二个示例,但是由于 A 在逻辑上拥有 B,我应该做一些与第一个示例更相似的事情吗?
class B;
class A final
{
public:
A(std::unique_ptr<B> b)
{
m_b = std::move(b);
}
B* GetB()
{
return m_b.get();
}
const B* GetB() const
{
return m_b.get();
}
private:
std::unique_ptr<B> m_b;
};
【问题讨论】:
-
使用pointer/smart_pointer时,由你来选择你想要的返回类型的限制。
-
不,您不会提供两个版本的 getter。只有
const-qualified getter 和非const-qualified setter。
标签: c++ pointers c++11 constants