c++参数传递

参数传递

参数传递的英文术语中,参数是argument,也就是实参,参数传递就是要把实参传递,或者说赋值给形参。

形参本质上只是一个函数内部的局部变量,他声明在参数列表中,这只是表明在调用函数的时候,我们会把第一个实参的值赋值给第一个形参。就好比在一家公司的柜台上有三个信封,三名员工将3份文件放入这三个信封内,之后,这三名员工会将文件送到预定的目的地,并会有人对相应文件进行在编辑。
所以简单来说,形参就是可操作的容器,实参是要放进去的内容,而参数传递就是将实参按指定顺序分别放到几个容器中。


按值传递

c++的参数传递主要有3种方式:按值传递、指针传递和引用传递。
他们的本质都跟变量、指针以及引用的初始化一样。

对于基本类型来说,按值传递就是简单的把实参传递给形参。对于自定义对象来说,也涉及拷贝赋值。

按值传递

#include<iostream>
#include<string>
using namespace std;

//按值传递

void printThings(int intNum,float floatNum,string str)
{
    
    
	cout << "打印整数:" << intNum << endl;
	cout << "打印浮点数:" << floatNum << endl;
	cout << "打印字符串:" << str << endl;
}
int main()
{
    
    
	int a = 3;
	float b = 1.0f;
	string str = "string";
	printThings(a,b,str);
	return 0;
}

运行结果
在这里插入图片描述
示例中的函数分别取3种类型的参数传递,对于整形和浮点型来说就是简单的赋值,而string由于是一种自定义对象,把它拷贝到形参时需要调用string重载的赋值运算进行拷贝。


指针传递

指针传递的本质上和按值传递一样,只是将一般的对象换成了指针。由于自定义对象的大小可能会很大(如上一节的string),赋值拷贝比较费时间,在这种情况下使用指针是非常高效的,因为它只要上传地址大小的数据。不仅对参数来说,而且在任何情况下我们都应该尽量使用自定义对象的指针。

另一个使用指针传递的情形是我们想要在函数中改变实参。

按值传递实现swap

#include <iostream>
using namespace std;

//按值传递实现swap

void swap(int a, int b)
{
    
    
	int temp = a;
	a = b;
	b = temp;
	cout <<"在交换函数末尾,a等于" << a << ",b等于" << b << endl;
}

int main()
{
    
    
	int a = 3;
	int b = 4;
	cout << "交换前,a等于" << a << ",b等于" << b <<endl;
	swap(a, b);
	cout << "交换后,a等于" << a << ",b等于" << b <<endl;
	return 0;
}

运行结果
在这里插入图片描述
可以看到,在swap()函数的最后,形参a和b是成功交换的。那么为什么出了函数以后,a又变回3了呢?之前说过,形参本质上是作用域仅限于函数内部的局部变量,实参只是把值赋值或是拷贝给形参,出了函数作用域后形参消失,而实参还是原来的样子。

指针传递实现swap

#include<iostream>
using namespace std;

//指针传递实现swap

void swap(int *pa,int *pb)
{
    
    
	int temp = *pa;
	*pa = *pb;
	*pb = temp;
	cout << "在交换函数末尾,a等于" << *pa <<",b等于" << *pb << endl;
}

int main()
{
    
    
	int a = 3;
	int b = 4;
	cout << "交换前,  a等于" << a <<",b等于" << b << endl;
	swap(&a, &b);
	cout << "交换后, a等于" << a <<",b等于" << b << endl;
	return 0;
}

运行结果
在这里插入图片描述
这一次在swap结束之后,a和b也保留了交换后的结果,这是因为我们传递了地址,在函数中通过解引用操作将形参的地址修改成与实参的地址一样。
要注意指针传参本质上也是按值传递,只不过拷贝的不是整个文件,而是电子版文件的地址。


引用传递

数字交换也可以通过引用传参实现:

引用传参实现swap

#include<iostream>
using namespace std;

//引用传递实现swap
void swap(int &a,int &b)
{
    
    
	int temp = a;
	a = b;
	b = temp;
	cout << "在交换函数末尾,a等于" << a << ",b等于" << b << endl;
}

int main()
{
    
    
	int a = 3;
	int b = 4;
	cout << "交换前, a等于" << a <<",b等于" << b << endl;
	swap(a, b);
	cout << "交换后, a等于" << a <<",b等于" << b << endl;
	return 0;
}

运行结果
在这里插入图片描述
示例中可以看到,除了形参声明的时候需要加“&”符号以外,其余的地方都与按值传递的示例一样,这样就不需要考虑解引用和取值地址的问题了。因此,在c++中使用引用传参是一种非常高效、简洁且不容易出错的方法。

猜你喜欢

转载自blog.csdn.net/m0_62870588/article/details/124140091
今日推荐