class Int
{
int value;
public:
int GetValue()const//获取成员数据的值
{
return value;
}
void SetValue(int x)//改写成员数据的值
{
value = x;
}
//将以上两个函数合成为一个函数完成两个功能
//方法一:通过函数的重载
int Value1()const
{
return value;
}
void Value1(int x)
{
value = x;
}
//方法二:使用引用作为返回值,这样可以给函数赋值也可以从函数中取值
int& Value2()
{
return value;
}
};
//方法一:利用函数的重载
int main()
{
Int a = 10;
cout << a.Value1() << endl;
a.Value1(20);
cout << a.Value1() << endl;
return 0;
}
//方法二:引用作为返回值
int main()
{
Int a=10;
int x = a.Value2();
cout << x << endl;
a.Value2() = 20;//相当于Value2(&a)=20; 由于Value2()函数是以引用的形式返回a的value值,函数返回值为引用时是左值,所以可以被赋值。
cout << a.Value2() << endl;
return 0;
}
函数能被赋值的条件是,函数返回值是左值,而函数返回值为左值的条件就是函数的返回值类型为引用。
总结:函数的返回值类型为引用时,其返回值为左值,可以被赋值;函数的返回值类型为普通值时,为右值(将亡值)。
但这样的函数对于常对象无法使用
int main()
{
const Int a=10;
int x=a.Value2();//error,a为常对象无法调用普通成员函数
cout<<a.Value()<<endl;
return 0;
}
为了解决这种问题,就需要将该函数改为常方法:
int& Value2()
{
return value;
}
const int& Value2()const//该方法设置为常方法时,返回值也必须改为常引用,因为以普通引用返回时,其他成员会改变该值,而常对象的成员数据不允许改变
{
return value;
}
int main()
{
const Int a=10;
int x=a.Value2();//ok
cout<<a.Value()<<endl;
return 0;
}
这样普通对象会调用普通函数获取值,修改值;而常对象则会调用常方法获取值,但不能更改,因为其返回值为常引用。常方法可以和普通方法进行重载。