我目前正在学习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
。
有人可以向我解释它是如何运作的吗?
感谢。
答案 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;
答案 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-correctness,Mutator_method,The Definitive C++ Book Guide and List(&#34;最佳做法&#34;以及&#34;中级&#34;)