在尝试使用我的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& intInput
或const int &intInput
等参考文献。 “&”符号在哪里真的很重要,还是仅仅是个人偏好的问题?
最后,我在上面的例子中做了什么好的做法?我打算开始研究一个更大的个人项目,我想在以后开始遇到问题之前将这些核心基础知识降下来。
答案 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++