为什么提供两个get函数

q09*_*987 5 c++ boost

class T
{};

class AccessT
{
public:
    boost::shared_ptr<const T> getT() const {return m_T;}
    boost::shared_ptr<T>       getT()       {return m_T;}

private:
    boost::shared_ptr<T> m_T;
};
Run Code Online (Sandbox Code Playgroud)

问题>我在遗留项目中看到了许多类似的代码.我真的不明白这样做的意义.为什么不简单地提供以下内容:

class T
{};

class AccessTModified
{
public:
    boost::shared_ptr<T> getT() const { return m_T; }

private:
    boost::shared_ptr<T> m_T;
};
Run Code Online (Sandbox Code Playgroud)

初始参数可能是boost::shared_ptr<const T> getT() const不允许const对象意外修改T. 如果是这种情况,所有这些功能应该提供两种版本吗?对我来说,我觉得很乏味!

Jos*_*ley 9

你是对的:目的boost::shared_ptr<const T> getT() const是确保const对象不会意外地修改T.

在C++中,这被称为const正确性,通常被认为是很好的C++设计.正如您所说,它通常会导致getter有两个版本(a const和非const版本).它可能最初很乏味(虽然一旦你习惯它也不错),但结果可能非常有用.Const正确性允许您声明函数

void DoSomething(const AccessT& item);
Run Code Online (Sandbox Code Playgroud)

承诺不修改,item以便编译器抛出错误,如果DoSomething任何声明可能修改item.

虽然const正确性通常被认为是很好的C++设计,但是一些开发人员认为必须声明某些函数的const和非const版本的开销比它的价值更麻烦.

如果您对更多信息感兴趣,C++ FAQ有关于const正确性的整个部分.