直接看示例代码:
int main(){
int &s1 = f.f1();
cout << s1 <<endl; //输出5
s1 = 20; //通过引用,改变了mszT
f.print(); //输出20
//int s1 = f.f1(); //语句成立,但无法通过s1改变mszT了
int &s3 = f.f3(); //语句报错,f3返回类型是const,所以接收的变量必须为const。
int const &s3 = f.f3(); // 正确
cout << s3 << endl; //输出 5
s3 = 20; // 语句报错,const类型无法改变
//const int s3 = f.f3(); //正确,但无法通过s3改变mszT了
}
class sz{
public:
int &f1(){
mszT = 5;
return mszT;
}
int f2() const{
return mszT;
}
const int &f3(){
mszT = 5;
return mszT;
}
const int &f4()const{
return mszT;
}
void print(){
cout << mszT << endl;
}
private:
int mszT;
};
结论:通过上面的分析可以得出,int &f1(){}
及const int &f3()
中的&使得返回一个引用,接收变量可以定义成相同类型的引用或非引用。如对于接收int &f1(){}
的变量可以写成int &a = f1()
或int a = f1()
。但返回引用的目的就是为了提高程序效率,因为这避免了复制到临时变量这个过程,所以最好把接收的变量也定义成引用。
有const时,接收变量必须定义成const类型,如对于const int &f3(){}
的接收变量必须写成const int &b = f3()
或不带&的const int b = f3()
。
当接收变量如果是引用且非const时,则可以改变引用的对象。如对int &f1(){}
,int &a = f1()
,则改变a
可以改变f1
里面的内容。