2016-05-23 49 views
0

在试图刷新我的C++时,我一直在试图找出创建访问器的最佳实践方式。C++ const访问器和引用最佳实践

我想澄清我的理解,并找出我所做的是对的。我有几个问题,但它们看起来非常简单,所以我将它们全部引入了这个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

+0

为什么downvote?另外,我已经更新了标题,尝试使它更清晰。 – Interminable

+0

我的猜测是,这是因为你问了不止一个问题。我们倾向于每个问题提出一个问题。也就是说,除了最后一个问题以外的所有问题都是微不足道的,所以在我看来没问题。然而,最后一个问题是,对于计算器而言,这两者都过于宽泛且意见相左。 – user2079303

+0

我确实认为他们对于个别问题来说过于微不足道。 至于最后一个,我主要是想知道我是否在做任何我没有发现的错误。 – Interminable

回答

3

变量,即const std :: string,这意味着它(我的类的成员变量)不能改变。那是对的吗?

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

在方法体之前的最后一个const指示该方法所属的类的任何成员都可以被更改,除非它们被指定为可变。这是否正确?

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

在我传入const方法参数的地方,这意味着我确保这些参数在传入时始终保存,从而保护传入的所有原始变量不被方法体改变。这是否正确?

正确。接受价值论据也可以达到同样的效果。

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

When have you used C++ 'mutable' keyword?

访问器似乎是一个好主意,甚至永远不会被公开曝光的数据,因为它可以确保一个入口点,允许更容易调试等工作。我是否在这里考虑右行

我不买这个说法。 Watchpoints允许轻松调试成员变量,无论它们从哪里访问。

从纯语法的角度来看,我应该写喜欢const int的& intInput或const int的& intInput我引用。

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

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

没有一般的答案。访问器有时很有用。通常他们是多余的。如果你提供了一个允许直接设置值的函数,比如你在这里执行的操作,那么你也可以摆脱访问器并且公开成员。

+0

Upvoted针对访问者的立场。 – SergeyA

+0

标记为答案,因为您在处理我问的所有问题时都​​有很好的解决方案! 尽管(我的调试点只是一个例子),但我仍然没有完全销售反访问者的想法。 我从来没有习惯使用它们,但有一种方法来控制成员数据的接入点对我来说似乎很好,因为如果您需要添加检查以设置成员数据的值,则不会有一个访问者有意义? – Interminable

+1

@不好意思,如果你的设计改变了,并且你后来想要阻止直接分配来支持检查的方法,我无法反驳你没有给出的私人界面的参数:),这可能不是问题更改可见性,添加访问器并修改代码以使用它。在公共API的情况下,你的论点是有效的。 – user2079303

0

我看来,像你对这里的概念相当不错的手柄。至于mutable的例子有很多,这里有一个:你有一个搜索方法,出于性能方面的原因,你缓存最后的搜索结果......内部缓存对于const搜索方法需要是可变的。即外部行为没有改变,但内部的东西可能会改变。

0

这里是mutable一些例子:

memoiziation高速缓存,用于当某事是referencially透明的, 但昂贵的计算,到第(const限定) 存取所述第一呼叫计算值和将其存储在可变成员散列表 表中,第二次和后续调用取而代之从表 中取值。

访问计数器,定时,记录仪和其他仪器需要 凡我访问器返回一个const引用改变一些状态,当一个常量限定的访问被称为

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