我遇到了一个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;
};
最佳答案
对于所有权情况,如果成员函数可以修改逻辑const
对象的一部分,恕我直言是不自然的,但这是一个设计问题。
但是,请注意,可以使用原始指针来实现所有权。
例如,考虑使用直接new
-ing和原始指针实现的内部数组。您不希望当/如果将其替换为用于处理存储的std::vector
时会中断的接口(interface)。因此,是否提供访问函数对的const
/ non-const
对的规则必须植根于设计级别,而不是该语言在给定设计实现中所允许的语言。