引用参数:
引用参数是由调用部位传入实参的地址(写在留言板上)的形参。
在形参表中以符号“&”开始的参数即为引用参数。如果一个形参是引用参数,调用部位将把实参的地址传递给子程序。子程序可以改变传递给引用参数的任何实参,因为子程序操作的是真正的变量,而不是它的副本。
传递引用给函数与传递指针的效果一样,传递的是原来的变量或对象,而不是在函数作用域内建立变量或对象的副本。
(1)需要改变实参的值
#include <iostream>
using namespace std;
void swap(int& x,int& y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 1,b = 2;
swap(a,b);
cout<<"a = "<<a<<"\t"<<"b = "<<b<<endl;
}
运行结果:
引用返回值:
函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。
#include<iostream>
using namespace std;
class A
{
public:
int x;
A(){};//类A的构造函数
A(const int xx)//带参数的构造函数的重载函数
{
x = xx;
}
A(const A& other)//复制构造函数
{
this->x = other.x;
cout<<"Copy"<<endl;
}
~A(){cout<<"调用析构函数."<<endl;}//析构函数
A& operator = (const A& other)//赋值函数
{
this->x = other.x;
cout<<"Assign"<<endl;
return *this;
}
void func1(A a)
{
a.x += 1;
cout<<"Calling func1."<<endl;
}
void func2(A& a)
{
a.x += 2;
cout<<"Calling func2."<<endl;
}
A func3()
{
cout<<"Calling func3."<<endl;
return *this;
}
A& func4()
{
cout<<"Calling func4."<<endl;
return *this;
}
};
(1) void func1(A a)
int main()
{
A a1(1),a2(2);
a2.func1(a1);
cout<<"a1.x = "<<a1.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果:
(2) void func2(A& a)
int main()
{
A a1(1),a2(2);
a2.func2(a1);
cout<<a1.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果:
(3) A func3( )
int main()
{
A a1(1),a2;
a2 = a1.func3();
cout<<a1.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果:
(4) A& func4( )
int main()
{
A a1(1),a2;
a2 = a1.func4();
a1.x++;
cout<<"a1.x = "<<a1.x<<endl;
cout<<"a2.x = "<<a2.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果:
有意思的是,如果把main改为:
int main()
{
A a1(1);
A a2 = a1.func4();
a1.x++;
cout<<"a1.x = "<<a1.x<<endl;
cout<<"a2.x = "<<a2.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果会不同:
这时,没有调用赋值,而是调用了复制。这是为什么?
可不可以这么理解:
之前产生"Copy"是因为采用值参数,也就是把a1这个参数给func1函数,所以需要产生一个副本保存在func函数栈里,所以调用了赋值函数,产生"Copy",这里a1不是引用参数传参。
而上面没有值参数,却也产生了"Copy"。和第一个func4调用相比,不同的是,之前的先声明了A a2,所以返回的引用返回值有对象填充,可以调用赋值函数将内容填充给已经声明过的a2。而后面这个是在调用func4时才同时声明A a2,而一般赋值运算先运行右边的。所以返回的引用返回值,也就是a1,发现a2是之前没有声明的,和之前的相比,调用复制函数效果一样,复制出来的就是a2。
如果把调用func4改为:
int main()
{
A a1(1);
A& a2 = a1.func4();
a1.x++;
cout<<"a1.x = "<<a1.x<<endl;
cout<<"a2.x = "<<a2.x<<endl;
cout<<"finish."<<endl;
return 0;
}
运行结果: