C++里引用参数与引用返回值

引用参数:

        引用参数是由调用部位传入实参的地址(写在留言板上)的形参。
        在形参表中以符号“&”开始的参数即为引用参数。如果一个形参是引用参数,调用部位将把实参的地址传递给子程序。子程序可以改变传递给引用参数的任何实参,因为子程序操作的是真正的变量,而不是它的副本。

        传递引用给函数与传递指针的效果一样,传递的是原来的变量或对象,而不是在函数作用域内建立变量或对象的副本。

(1)需要改变实参的值

#include 
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 = "<
运行结果:

C++里引用参数与引用返回值_第1张图片


引用返回值:

        函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。



#include
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"<x = other.x;
		cout<<"Assign"<


(1)  void func1(A a)

int main()
{
	A a1(1),a2(2);
	a2.func1(a1);
	cout<<"a1.x = "<


运行结果:

C++里引用参数与引用返回值_第2张图片

(2)  void func2(A& a)

int main()
{
	A a1(1),a2(2);
	a2.func2(a1);
	cout<
运行结果:

C++里引用参数与引用返回值_第3张图片

(3)  A func3( )

int main()
{
	A a1(1),a2;
	a2 = a1.func3();
	cout<
运行结果:

C++里引用参数与引用返回值_第4张图片

(4)  A& func4( )

int main()
{
	A a1(1),a2;
	a2 = a1.func4();
	a1.x++;
	cout<<"a1.x = "<
运行结果:

C++里引用参数与引用返回值_第5张图片

有意思的是,如果把main改为:

int main()
{
	A a1(1);
	A a2 = a1.func4();
	a1.x++;
	cout<<"a1.x = "<
运行结果会不同:
C++里引用参数与引用返回值_第6张图片

这时,没有调用赋值,而是调用了复制。这是为什么?

可不可以这么理解:

之前产生"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 = "<
运行结果:

C++里引用参数与引用返回值_第7张图片


你可能感兴趣的:(C++,引用参数,引用返回值)