C++ const 访问器和引用最佳实践
C++ const accessors and references best practice
为了复习我的 C++,我一直在尝试找出创建访问器的最佳实践方法。
我想澄清一下我的理解,看看我的做法是否正确。我有几个问题,但它们看起来很简单,所以我将它们全部汇总到这个 Stack Overflow 问题中。
以下是一些示例代码,代表我 'think' 是正确的做事方式:
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;
}
};
我的问题是:
其中我的访问器return一个const
引用变量,即const std::string
,这意味着它(我的class的成员变量)不能改变。对吗?
方法主体之前的最后一个 const
表示该方法所属的 class 的任何成员都不能更改,除非它们被指定为 mutable
。这也对吗?
我传入 const
方法参数的地方,这意味着我确保这些参数始终在传入时存储,从而保护传入的任何原始变量不被方法主体更改.这也对吗?
关于 mutable
关键字,在什么情况下我会真正想要使用它?我一直在努力想一个好的场景,我有一个需要修改 class 成员的 const 方法。
访问器似乎是个好主意,即使对于永远不会公开的数据也是如此,因为它确保了单点入口,允许更容易调试等等。我在这里的思路是正确的,还是这实际上完全没有意义,不需要私有访问器?
从纯粹的句法角度来看,我应该像 const int& intInput
或 const int &intInput
这样写我的参考文献吗?符号在哪里真的很重要,还是只是个人喜好问题?
最后,我在上面的示例中所做的是好的做法吗?我打算开始从事一个更大的个人项目,我想在开始 运行 解决问题之前先了解这些核心基础知识。
在我看来,您对这里的概念掌握得很好。至于 mutable
的例子有很多,这里有一个:你有一个搜索方法,出于性能原因,你缓存了最后的搜索结果......对于 const 搜索方法,内部缓存需要是可变的。 IE。外部行为没有改变,但内部可能会发生一些变化。
以下是 mutable
的一些示例:
memoiziation caches, for when something is referencially-transparent,
but expensive to calculate, the first call to the (const-qualified)
accessor calculates the value and stores it in a mutable member hash
table, second and subsequent calls fetch the value from the table
instead.
access counters, timing, loggers, and other instrumentation that needs
to change some state when a const-qualified accessor is called
来自https://www.quora.com/When-should-I-actually-use-a-mutable-keyword-in-C++
Where my accessors return a const reference variable, ie const std::string, this means that it (my class's member variable) cannot be changed. Is that correct?
正确。无法通过 const 引用更改变量。
The last const before a method's body indicates that no members of the class for which that method is a part of can be altered, unless they are designated mutable. Is this also correct?
正确。它还允许在 const 对象上调用函数。
Where I'm passing in const method parameters, this means that I ensure these parameters are always stored as they were passed in, thus protecting any original variables being passed in from being altered by the method body. Is this also correct?
正确。同样可以通过按值接受参数来实现。
With regards to the mutable keyword, under what circumstances would I actually want to use this?
见When have you used C++ 'mutable' keyword?
Accessors seem like a good idea, even for data that will never be publicly exposed, because it ensures a single-point of entry, allowing for easier debugging and so on. Am I thinking along the right lines here
我不赞成这种说法。观察点允许轻松调试成员变量,而不管它们是从哪里访问的。
From a purely syntactical perspective, should I be writing my references like const int& intInput or const int &intInput.
两者在语法上是等价的,它们之间的选择纯粹是美学上的。
Finally, is what I'm doing in the example above good practice?
没有统一的答案。访问器有时很有用。通常它们是多余的。如果你提供了一个允许直接设置值的函数,比如你在这里做的,那么你还不如去掉访问器,让成员成为 public.
为了复习我的 C++,我一直在尝试找出创建访问器的最佳实践方法。
我想澄清一下我的理解,看看我的做法是否正确。我有几个问题,但它们看起来很简单,所以我将它们全部汇总到这个 Stack Overflow 问题中。
以下是一些示例代码,代表我 'think' 是正确的做事方式:
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;
}
};
我的问题是:
其中我的访问器return一个const
引用变量,即const std::string
,这意味着它(我的class的成员变量)不能改变。对吗?
方法主体之前的最后一个 const
表示该方法所属的 class 的任何成员都不能更改,除非它们被指定为 mutable
。这也对吗?
我传入 const
方法参数的地方,这意味着我确保这些参数始终在传入时存储,从而保护传入的任何原始变量不被方法主体更改.这也对吗?
关于 mutable
关键字,在什么情况下我会真正想要使用它?我一直在努力想一个好的场景,我有一个需要修改 class 成员的 const 方法。
访问器似乎是个好主意,即使对于永远不会公开的数据也是如此,因为它确保了单点入口,允许更容易调试等等。我在这里的思路是正确的,还是这实际上完全没有意义,不需要私有访问器?
从纯粹的句法角度来看,我应该像 const int& intInput
或 const int &intInput
这样写我的参考文献吗?符号在哪里真的很重要,还是只是个人喜好问题?
最后,我在上面的示例中所做的是好的做法吗?我打算开始从事一个更大的个人项目,我想在开始 运行 解决问题之前先了解这些核心基础知识。
在我看来,您对这里的概念掌握得很好。至于 mutable
的例子有很多,这里有一个:你有一个搜索方法,出于性能原因,你缓存了最后的搜索结果......对于 const 搜索方法,内部缓存需要是可变的。 IE。外部行为没有改变,但内部可能会发生一些变化。
以下是 mutable
的一些示例:
memoiziation caches, for when something is referencially-transparent, but expensive to calculate, the first call to the (const-qualified) accessor calculates the value and stores it in a mutable member hash table, second and subsequent calls fetch the value from the table instead.
access counters, timing, loggers, and other instrumentation that needs to change some state when a const-qualified accessor is called
来自https://www.quora.com/When-should-I-actually-use-a-mutable-keyword-in-C++
Where my accessors return a const reference variable, ie const std::string, this means that it (my class's member variable) cannot be changed. Is that correct?
正确。无法通过 const 引用更改变量。
The last const before a method's body indicates that no members of the class for which that method is a part of can be altered, unless they are designated mutable. Is this also correct?
正确。它还允许在 const 对象上调用函数。
Where I'm passing in const method parameters, this means that I ensure these parameters are always stored as they were passed in, thus protecting any original variables being passed in from being altered by the method body. Is this also correct?
正确。同样可以通过按值接受参数来实现。
With regards to the mutable keyword, under what circumstances would I actually want to use this?
见When have you used C++ 'mutable' keyword?
Accessors seem like a good idea, even for data that will never be publicly exposed, because it ensures a single-point of entry, allowing for easier debugging and so on. Am I thinking along the right lines here
我不赞成这种说法。观察点允许轻松调试成员变量,而不管它们是从哪里访问的。
From a purely syntactical perspective, should I be writing my references like const int& intInput or const int &intInput.
两者在语法上是等价的,它们之间的选择纯粹是美学上的。
Finally, is what I'm doing in the example above good practice?
没有统一的答案。访问器有时很有用。通常它们是多余的。如果你提供了一个允许直接设置值的函数,比如你在这里做的,那么你还不如去掉访问器,让成员成为 public.