C ++函数成员返回

时间:2014-09-10 20:27:35

标签: c++

我目前正在学习C ++的基础知识,我找到了以下代码:

#include <iostream>
using namespace std;

class MyClass {
    int x;
public:
    MyClass(int val) : x(val) {}
    int& get() {return x;}
};

int main() {
  MyClass foo (10);
  foo.get() = 15;  
  cout << foo.get() << '\n';

  return 0;  
}

我不明白为什么行foo.get() = 15有效。对我来说,它看起来像是一个同时获得和设置。我想这很有效,因为返回类型为int&,而不仅仅是int

有人可以向我解释它是如何运作的吗?

感谢。

4 个答案:

答案 0 :(得分:5)

您的foo.get正在将reference返回int(注明int&)。

可以指定引用(因此它们是 l-values )。阅读C++ references上的wikipage,它解释得比我有时间要好。或仔细阅读一本好的C ++编程书,例如Stroustrup的Programming : Principles and Practice Using C++a Tour of C++The C++ Programming Language(或全部!)

Neil Kirk所述,您可以几乎将引用视为隐式取消引用的指针。换句话说,如果您熟悉C,请考虑int* get() { return &x; }*foo.get() = 15;

另见reference vs. pointer question

答案 1 :(得分:2)

该行有效,因为该函数返回引用,它在语义上等同于:

  int* get() {return &x;}

  *foo.get() = 15;

答案 2 :(得分:1)

在C ++中,函数的返回值是一个变量,它存储在堆栈或堆中,但没有已知的名称。 所以这里

int& get() {return x;}

所以foo.get()作为一个组(foo.get())返回一个变量,在你的情况下这是一个引用变量,这意味着(foo.get())的返回是变量x里面的foo class。

这样做foo.get()= 15与执行foo.x = 15相同,因为它是通过引用返回的。

注意:foo.x = 15会给编译器错误,因为默认情况下x是私有的,但是可以将它作为参考来返回它。

答案 3 :(得分:0)

编写的代码完全有效。您返回对用户代码的非常量引用。用户为其分配,因此您的类成员变量获得新值。

您似乎担心在此处保留encapsulation。从这个角度来看,在你写的形式中,你的吸气剂是不正确的。大多数情况下,我们返回值或常量引用:

int get() { return x; }

const int& get() { return x; }

这样用户将无法改变返回的成员变量。 Getter是个笨蛋&#34;回到我身边&#34;函数,所以,大多数情况下,我们假设它不会改变内部类状态。为了保持谨慎,我们还经常让吸气成员保持不变:

const int& get() const { return x; }

当然也有例外(特别是lazy eveluation)。而且,用户可以抛弃constness。但这是另一个故事。

另请参阅:Const-correctnessMutator_methodThe Definitive C++ Book Guide and List(&#34;最佳做法&#34;以及&#34;中级&#34;)