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

C++ C++;常量访问器和参考最佳实践,c++,reference,constants,accessor,C++,Reference,Constants,Accessor,尝试刷新我的C++时,我一直在寻找创建访问器的最佳实践方法。 我想澄清我的理解,看看我所做的是否正确。我有几个问题,但它们看起来很简单,所以我把它们都放到了这个单堆栈溢出问题中 以下是一些示例代码,代表我“认为”的正确做事方式: class MyClass { private: std::string StringMember_; int IntMember_; public: MyClass(const std::string &stringInput, co

尝试刷新我的C++时,我一直在寻找创建访问器的最佳实践方法。 我想澄清我的理解,看看我所做的是否正确。我有几个问题,但它们看起来很简单,所以我把它们都放到了这个单堆栈溢出问题中

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

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方法

访问器似乎是一个好主意,即使对于永远不会公开的数据也是如此,因为它确保了单个入口点,允许更容易的调试等等。我在这里的想法是正确的,还是事实上完全没有意义,不需要私人访问器

从纯粹的语法角度来看,我应该像
const-int&intInput
const-int&intInput
那样编写引用吗。符号在哪里真的很重要,还是只是个人喜好的问题

最后,我在上面的例子中所做的是好的实践吗?我计划开始做一个更大的个人项目,我想在以后遇到问题之前把这些核心的基本知识都记下来


我用它作为参考:

在我看来,你对这里的概念有很好的理解。对于一个
可变的
示例,有很多,这里有一个:您有一个搜索方法,出于性能原因,您可以缓存最后的搜索结果。。。对于常量搜索方法,该内部缓存需要是可变的。也就是说,外部行为没有改变,但内部可能会发生变化。

在我看来,您对这里的概念掌握得相当好。对于一个
可变的
示例,有很多,这里有一个:您有一个搜索方法,出于性能原因,您可以缓存最后的搜索结果。。。对于常量搜索方法,该内部缓存需要是可变的。也就是说,外部行为没有改变,但内部可能会发生一些变化。

以下是
可变的一些示例:

记忆缓存,因为当某些东西是透明的, 但是计算起来很昂贵,第一次调用(const-qualified) 访问器计算该值并将其存储在可变成员散列中 表,第二次和后续调用从表中获取值 相反

访问需要的计数器、计时、记录器和其他仪器 在调用常量限定访问器时更改某些状态


从这里有一些
可变的示例:

记忆缓存,因为当某些东西是透明的, 但是计算起来很昂贵,第一次调用(const-qualified) 访问器计算该值并将其存储在可变成员散列中 表,第二次和后续调用从表中获取值 相反

访问需要的计数器、计时、记录器和其他仪器 在调用常量限定访问器时更改某些状态

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

对。不能通过常量引用更改变量

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

对。它还允许对常量对象调用函数

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

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

关于mutable关键字,在什么情况下我会真正想使用它

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

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

从纯粹的语法角度来看,我是否应该像const int&intInput或const int&intInput那样编写我的引用

两者在句法上是对等的,两者之间的选择纯粹是审美的

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

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

我的访问器返回一个常量引用变量,即const std::string,这意味着它(我的类的成员变量)可以