这是关于“返回引用类型的成员函数(可以返回私有数据成员的引用) ”的内容
老师课上的PPT(随便扫两眼就行啦)
class A{
float x,y;
public:
float &Getx(void ) { return x; } //返回x的引用
void Set(float a,float b) { x=a; y=b; }
void Print(void) { cout<<x<<'\t'<<y<<endl; }
};
void main(void)
{ A a1,a2;
a1.Set (3,5);
cout<<"a1: "; a1.Print ();
a1.Getx()=30; //将a1对象中的x成员赋值
cout<<"changed a1: ";
a1.Print ();
}
类中出现float &Getx(...){...},
在类外使用时是a1.Getx()=30。
这边相差了一个&。
为了方便理解,上例子进行比较。
一
#include <iostream>
using namespace std;
class A
{
public:
int a;
int &geta() { return a; }
};
int main()
{
A n;
n.geta() = 2;
cout << n.geta();
}
输出:2
二
#include <iostream>
using namespace std;
class A
{
public:
int a;
int &geta() { return a; }
};
int main()
{
A n;
n.&geta() = 2;
cout << n.geta();
}
结果:n.&geta() = 2;语法错误,应输成员名。可见&并不包含于成员名中。
三
#include <iostream>
using namespace std;
class A
{
public:
int a;
int geta() { return a; }
};
int main()
{
A n;
n.geta() = 2;
cout << n.geta();
}
结果:n.geta() = 2;语法错误。表达式必须是可修改的左值。
下面来进一步了解这两种函数
一
#include <iostream>
using namespace std;
class A
{
public:
int a;
int &geta() { return a; }
};
int main()
{
A n;
n.geta() = 2;
cout << &(n.geta());
}
输出:000000BD1FD6F904
(就是地址啦)
二
#include <iostream>
using namespace std;
class A
{
public:
int a;
int geta() { return a; }
};
int main()
{
A n;
cout << &(n.geta());
}
结果:最后一行报错,因为它不是左值(左值,赋值符号左侧的变量,有自己的地址)
三
#include <iostream>
using namespace std;
class A
{
public:
int a;
int geta() { return a; }
};
int main()
{
A n;
cout << (n.geta());
}
输出:-858993460
(系统自动给a赋的值啦)
To conclude
int geta() { return a; }和int &geta() { return a; }差别在于后者是引用,前者仅是告诉你a的值是多少,而后者可以让你对a进行操作,例如给a赋值,取a的地址。
用int geta() { return a; },我可以把n.geta()看成一个数,比如,把它看成2。用int &geta() { return a; },我可以把n.geta()看成a,这个a是对象n中的a。