• c++参数传递


    参数传递

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

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


    按值传递

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

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

    按值传递

    #include
    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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


    指针传递

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

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

    按值传递实现swap

    #include 
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    指针传递实现swap

    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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


    引用传递

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

    引用传参实现swap

    #include
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

  • 相关阅读:
    Android HIDL 介绍学习之客户端调用
    构建自己的插件框架:第 1 部分
    vuex基础教学(1)
    xctf攻防世界 MISC之CatFlag
    排序算法(一)
    [附源码]计算机毕业设计springboot基于Web的软考题库平台
    VRRP 虚拟路由器冗余协议的解析和配置
    高通Android 12 右边导航栏改成底部显示
    es实操笔记
    会议OA之我的审批
  • 原文地址:https://blog.csdn.net/m0_62870588/article/details/124140091