首页 > 编程语言 >C++——参数传递

C++——参数传递

时间:2022-10-02 17:22:18浏览次数:56  
标签:传递 temp 形参 int C++ 参数传递 实参 拷贝

前言:

  形式参数(形参):出现在函数定义的地方,形参之间以“,”分隔,其规定了函数接受数据的类型和数量(参数的数目)

  实际参数(实参):出现在函数调用的地方,用于初始化形参(实参的数目、类型与形参相同)。

一、值传递

  值传递,顾名思义,仅仅传递实参的值,因而形参无法改变实参。

 1 #include <iostream>
 2 
 3 void swap(int a, int b) {
 4     int temp;
 5     temp=a;
 6     a=b;
 7     b=temp;
 8     std::cout << "a is " << a << ";" << "b is " << b << std::endl;
 9 
10 }
11 
12 int main(int argc, char * argv[]) {
13     int m=1,n=2;
14     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
15     swap(m,n);
16     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
17 }

  执行上述代码可见如下结果:

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 1;n is 2

  可见当参数以值传递时,形参的改变并不会改变实参

二、指针传递

  指针传递,也就是将实参的地址传递给形参,因而可以修改实参的值,但是这种方法容易出错,导致参数被程序非法访问。

 1 #include <iostream>
 2 
 3 void swap(int *a, int *b) {
 4     int temp_int=0;
 5     int *temp_ptr=&temp_int;
 6     temp_ptr=a;
 7     a=b;
 8     b=temp_ptr;
 9     std::cout << "a is " << *a << ";" << "b is " << *b << std::endl;
10 
11 }
12 
13 int main(int argc, char * argv[]) {
14     int m=1,n=2;
15     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
16     swap(&m,&n);
17     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
18 }

  指针传递实际上传递的是实参的地址,进而可以通过指针修改形参的值,但实参本身并没有发生变化。其结果如下所示:

  

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 1;n is 2

三、引用传递

  引用传递,此时形参就是实参的别名,因而可以修改实参的值。

 1 #include <iostream>
 2 
 3 void swap(int &a, int &b) {
 4     int temp;
 5     temp=a;
 6     a=b;
 7     b=temp;
 8     std::cout << "a is " << a << ";" << "b is " << b << std::endl;
 9 }
10 
11 int main(int argc, char * argv[]) {
12     int m=1,n=2;
13     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
14     swap(m,n);
15     std::cout << "m is " << m << ";" << "n is " << n << std::endl;
16 }

  引用传递不同于前两者,此时的形参是实参的别名,因此对于形参的操作也就是对于实参的操作。

1 m is 1;n is 2
2 a is 2;b is 1
3 m is 2;n is 1

四、注意

  1、传值或是传址本质上是一种拷贝操作,前者拷贝变量本身,后者拷贝变量的地址。对于某些class中类型对象或容器对象,拷贝操作比较低效,甚至有些类的类型不支持拷贝操作(IO类型)。因此在C++中我们应尽量采用引用避免拷贝

  2、利用引用传递我们也可以返回额外的信息(一个函数只能返回一个值,而引用调用可以改变实参帮助我们返回额外的信息)

五、参考

  1、C++ Primer(中文版/第五版)——6.2.2(P188)

标签:传递,temp,形参,int,C++,参数传递,实参,拷贝
From: https://www.cnblogs.com/hjxiamen/p/16743590.html

相关文章

  • c/c++ 时间函数
    c语言相关函数#include<stdio.h>#include<time.h>voidtime_test_func(){time_tseconds;seconds=time(NULL);printf("从1970-01-0100:00:00到......
  • 《Effective C++:改善程序与设计的55个具体做法》阅读笔记
    Item13:使用对象管理资源资源管理对象:资源管理对象管理着其他对象的资源,当资源管理对象的析构函数被调用时,所管理的资源会被自动释放。资源管理对象就是在其析构函数中......
  • C++——史蒂夫
    #include<iostream>#include<string>#include<windows.h>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(intargc,char**argv){//连接我的世......
  • C/C++ 实现INI配置文件读写 [转载]
    INI文件是一种标准的Windows平台配置文件,通常这种配置文件用于保存系统软件的一些基本配置参数,如下代码是本人从网络上收集到的一段纯C++编写的配置解析......
  • C++实现双向RRT算法
    C++实现双向RRT算法背景介绍RRT(Rapidly-exploringRandomTrees)是StevenM.LaValle和JamesJ.KuffnerJr.提出的一种通过所及构建空间搜索树实现对非凸高维空间快速搜......
  • [ 数据结构 - C++]红黑树RBTree
    在上篇文章我们了解了第一种平衡二叉搜索树AVL树,我们知道AVL树是通过平衡因子来控制左右子树高度差,从而将二叉树变成一颗平衡二叉搜索树。本篇文章我们将要了解另外一种平衡......
  • c++的四种类型转换
    const_cast<> 表示消除const属性static_cast<> 编译时就检查、没鸟用reinterpret_cast<>表示两个没关系的类型转换dynamic_cast<>运行时转换、父转子 总结:没......
  • c++ string类 和c 风格string 的问题梳理
    1.互相转换:c++---> c:           cppstr.c_str()c   ---> c++: stringcppstr=string(cstr)打印时、co......
  • c++ const 总结
    1.基本的定义一个常量 constinta=xxx2.constchar*p,char*constp区别前者表示指向的内容不能用p修改后者表示p不能指向别处const......
  • UE C++教程之接口 UINTERFACE
    我是谁不重要,重要的是,我能做什么。近期笔者在进行UE的开发时,实现多武器的换弹与开火需要用到接口。而笔者以前是做Unity开发的,遂没有使用过UEC++的UINTERFACE,而这个接......