C ++ const访问器和参考最佳实践

时间:2016-05-23 13:53:53

标签: c++ reference const accessor

在尝试使用我的C ++时,我一直在尝试找出创建访问器的最佳实践方法。

我想澄清我的理解并找出我所做的事情是否正确。我有几个问题,但它们看起来非常简单,所以我把它们全部卷入了这个Stack Overflow问题。

以下是一些示例代码,表示我认为正确的做事方式:

class MyClass
{
private:
    std::string StringMember_;
    int IntMember_;

public:
    MyClass(const std::string &stringInput, const int &intInput) : StringMember_(stringInput), IntMember_(intInput)
    {
    }

    const std::string &StringMember() const
    {
        return StringMember_;
    }

    void StringMember(const std::string &stringInput)
    {
        StringMember_ = stringInput;
    }

    const int &IntMember() const
    {
        return IntMember_;
    }

    void IntMember(const int &intInput)
    {
        IntMember_ = intInput;
    }
};

我的问题是:

我的访问器返回const引用变量,即const std::string,这意味着它(我的类的成员变量)无法更改。这是对的吗?

方法主体之前的最后一个const表示不能更改该方法所属的类的成员,除非它们被指定为mutable。这也是正确的吗?

在我传入const方法参数的情况下,这意味着我确保这些参数在传入时始终存储,从而保护传入的任何原始变量不被方法体更改。这也是正确的吗?

关于mutable关键字,在什么情况下我真的想要使用它?我一直在努力想到一个好的场景,我有一个需要修改类成员的const方法。

访问器似乎是一个好主意,即使对于永远不会公开的数据也是如此,因为它确保了单点输入,允许更容易的调试等等。我是否在这里思考正确的方向,或者这实际上是完全没有意义的,并且不需要私人访问者?

从纯粹的语法角度来看,我应该编写const int& intInputconst int &intInput等参考文献。 “&”符号在哪里真的很重要,还是仅仅是个人偏好的问题?

最后,我在上面的例子中做了什么好的做法?我打算开始研究一个更大的个人项目,我想在以后开始遇到问题之前将这些核心基础知识降下来。

我使用此作为参考:https://isocpp.org/wiki/faq/const-correctness

3 个答案:

答案 0 :(得分:4)

  

我的访问器返回一个const引用变量,即const std :: string,这意味着它(我的类'成员变量)无法更改。这是对的吗?

正确。无法通过const引用更改变量。

  

方法体之前的最后一个const表示该方法所属的类的成员不能被更改,除非它们被指定为可变的。这也是正确的吗?

正确。它还允许在const对象上调用函数。

  

如果我传入const方法参数,这意味着我确保这些参数在传入时始终存储,从而保护传入的任何原始变量不被方法体更改。这也是正确的吗?

正确。通过值接受参数可以实现同样的效果。

  

关于mutable关键字,在什么情况下我真的想要使用它?

请参阅When have you used C++ 'mutable' keyword?

  

访问器似乎是一个好主意,即使对于永远不会公开的数据也是如此,因为它确保了单点输入,允许更容易的调试等等。我在这里思考正确的方向

我不买这个论点。观察点允许轻松调试成员变量,无论他们从何处访问。

  

从纯粹的语法角度来看,我应该编写像const int& amp; intInput或const int& intInput。

两者在语法上都是等价的,它们之间的选择纯粹是美学。

  

最后,我在上面的例子中做了什么好的做法?

没有一般答案。访问者有时很有用。他们常常是多余的。如果你提供一个允许直接设置值的函数,比如你在这里做的那样,那么你也可以去除访问器并使成员公开。

答案 1 :(得分:0)

对我而言,就像你对这里的概念有很好的把握。至于mutable示例,有很多,这里有一个:你有一个搜索方法,并且出于性能原因你缓存了最后的搜索结果......内部缓存需要对const搜索方法是可变的。即外部行为没有改变,但内部可能会发生变化。

答案 2 :(得分:0)

以下是@Override public boolean onTouch(View v, MotionEvent event) { switch (v.getId()) { case R.id.imageView: Log.d("Tag", "X,Y : " + event.getX() + "," + event.getY()); int x = (int) event.getX(); int y = (int) event.getY(); int pixel = bitmap.getPixel(x,y); if(pixel == Color.parseColor("#94e3f9")) { Toast.makeText(MainActivity.this, "Blue Color", Toast.LENGTH_SHORT).show(); } if(pixel == Color.parseColor("#f0c828")) { Toast.makeText(MainActivity.this, "Yellow Color", Toast.LENGTH_SHORT).show(); } break; } return true; } 的一些示例:

  备忘录缓存,当某些内容是透明的时候,   但计算成本高,第一次调用(const-qualified)   accessor计算该值并将其存储在可变成员哈希中   table,second和后续调用从表中获取值   代替。

     

访问需要的计数器,计时器,记录器和其他仪器   在调用const限定访问器时改变某些状态

来自https://www.quora.com/When-should-I-actually-use-a-mutable-keyword-in-C++