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

C++ const accessors and references best practice

本文关键字:最佳 参考 常量 访问 C++      更新时间:2023-10-16

在学习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

如果我的访问器返回const引用变量,即const std::string,这意味着它(我的类的成员变量)不能更改。这是正确的吗?

正确。变量不能通过常量引用进行更改。

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

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

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

正确。通过按值接受参数也可以实现同样的目的。

关于可变关键字,在什么情况下我真正想使用它?

请参阅您何时使用C++';可变';关键字?

即使对于永远不会公开的数据,访问器似乎也是一个好主意,因为它确保了一个单一的入口点,允许更容易的调试等等

我不相信这个论点。监视点允许轻松调试成员变量,无论从何处访问它们。

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

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

最后,我在上面的例子中所做的是好的实践吗?

没有一般的答案。访问者有时很有用。它们通常是多余的。如果您提供了一个允许直接设置值的函数,比如您在这里所做的,那么您还可以去掉访问器并将成员公开。

在我看来,您对这里的概念掌握得很好。就mutable示例而言,有很多,这里有一个:您有一个搜索方法,出于性能原因,您缓存最后的搜索结果。。。对于const搜索方法,该内部缓存需要是可变的。也就是说,外在的行为没有改变,但内在的东西可能会改变。

以下是mutable:的一些示例

内存缓存,用于当某些东西是引用透明的时,但是计算成本很高,第一次调用(constqualified)访问者计算值并将其存储在可变成员哈希中表,第二个和后续调用从表中获取值相反

访问计数器、定时、记录器和其他需要的仪器当const限定的访问器被称为时更改某些状态

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