c++ 参数传递

参数传递:

  1. 形参(parameter)和实参(argument):

    int num (int a, int b);
    int num (int a, int b){return a+b;
    }//在函数的声明或者定义里,由由0个或多个形参组成的列表。int main(){int n=1,m=1;cout<<num(n,m);//我们用调用运算符来执行函数,调用运算符形式是个圆括号,圆括号内是由逗号隔开的实参列表。我们用实参初始化函数的形参。
    }
    
  2. 形参的类型决定了形参实参交互的方式,如形参是引用类型,他将绑定到对应的实参上,引用形参是它对应实参的别名。否则,将实参的值拷贝后赋给形参。

    当形参是引用类型,我们说,它对应的实参被引用传递(passed by reference)或者函数被传引用调用(called by reference)。

    当实参的值被拷贝给形参时,我们说,这样的实参被值传递(passed by value)或者函数被传值调用(called by value)。

  3. 传值参数:

    初始化一个非引用类型变量,初始值被拷贝给变量,对变量的改动不会影响初始值。

    int n = 0;
    int i = n;
    i =1;
    cout << n;//输出0,i的值改变,n的值不变。
    

    指针形参:指针的行为和其他非引用类型一样,当执行指针拷贝操作,拷贝的是指针的值。拷贝之后,两个指针是不同的指针。因为通过指针,我们可以间接访问它所指对象,所以通过指针可以修改它所指对象的值。

    void reset(int *ip){*ip = 0;//只改变了指针所指对象的值。ip = 0;//这里改变的只是ip的局部拷贝,实参并未改变
    }
    int i = 1;
    reset(&i);//改变i的值而非i的地址
    cout << "i = " << i <<endl;//输出i=0。
    ——————————————————————————————————————
    //实参类似于下面:(q)
    int i = 1;
    int *q = &i;
    //形参类似于下面:(p)
    int n = 0;
    int *p = &n;
    //实参调用形参类似与下面:
    p = q;//p指向了i
    *p = 2;//通过p改变了i,但是此时q并未改变。
    
  4. 传引用参数:

    对于引用的操作,实际上是作用在引用所引的对象上。通过引用形参,允许函数改变一个或多个实参的值。

    void reset (int &i){//形参i仅仅是实参j的又一个名字,在reset内部对i的使用即是对实参j的使用。i = 0;//改变了i所引对象的值。
    }
    int j=1;
    reset(j);//j采用传引用方式,因此他的值被改变。
    cout<<j<<endl;//输出j=0。
    
  5. 传引用参数:当形参是顶层const时,传给他常量对象或者非常量对象都是可以的。

    const int ci = 1;
    int i = ci;//正确,当拷贝ci时,忽略了它的顶层const。
    int *const p = &i;//const是顶层的,不能给p赋值。
    *p = 0;//正确,通过p改变对象内容是允许的。//在c++中,允许定义若干具有相同名字的函数,不过前提是不同函数的形参列表应该具有明显区别。
    void fcn(const int i){}//调用fcn函数时,既可以传入const int也可以传入int。
    void fcn(int i){}//此时再写一个函数定义,会报错误,因为重复定义了fcn(int)。
    
  6. 传引用参数:我们可以用非常量初始化一个底层const对象,但无法用一个底层const对象初始化一个非常量。如果形参是一个非常量,那么实参不能是一个底层const对象

   int i = 1;const int *cp = &i;//正确,但是cp不能改变iconst int &r = i;//正确,但是r不能改变iconst int &r2 = 1;//正确int *p = cp;//错误,p类型和cp类型不匹配int &r3 = r;//错误,r3类型和r类型不匹配int &r4 = 1;//错误,不能用字面值初始化一个非常量引用

同样的初始化规则应用到参数传递上:

   void reset(int *ip){...}void reset(int &i){...}string::size_type find_char(const string &s,char c,string::size_type &occurs){...}int i = 0;const int ci = i;string::size_type ctr = 0;reset(&i);//正确,调用形参类型是int*的reset函数。reset(&ci);//错误,不能用指向const int对象的指针初始化int*。reset(i);//正确,调用形参类型是int&的reset函数。reset(ci);//错误,不能把普通引用绑定到const对象ci上。reset(42);//错误,不能把普通引用绑定到字面值上。reset(ctr);//错误,类型不匹配find_char("hello world!",'o',ctr);//正确,find_char第一个形参是对常量的引用。
  1. 尽量使用常量引用:

    把函数不会改变的形参定义成普通的引用会给函数调用者一种误导,即函数可以修改它实参的值。此外,使用引用而非常量引用也会极大限制函数所能接受实参类型。不能把const对象、字面值、或者需要类型转换的对象传递给普通的引用形参。

    string::size_type find_char(string &s,char c,string::size_type &occurs){...}
    find_char("hello world!",'o',ctr);//编译时发生错误,因为不能把普通引用绑定到const对象上。应该把string &s修改为const string &sbool is_sentence(const string &s){string ::size_type ctr = 0;return find_char(s,'.',ctr) == s.size() - 1 && ctr == 1;//编译时发生错误,因为s是常量引用,但find_char被定义成只接受普通引用。修改的话,需要改正find_char的形参,应该把find_char形参的string &s修改为const string &s
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++定义成员函数

1.定义和声明成员函数的方式和普通函数差不多。成员函数的声明必须在类的内部&#xff0c;他的定义则即可以在类的内部也可以在类的外部。非成员函数的定义和声明都在类的外部。 struct Sales_data{std::string isbn() const { return bookNo; }double avg_price() const;std:…

java拖动图片拼图_求教,我的这个拼图程序中的移动图片的改怎么做

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class button extends JPanel implements MouseListener, ActionListener {/****/private static final long serialVersionUID 1L;private JButton[] button;private ImageIcon[] puzzlep;private JButton kbbutton;priva…

c++函数返回值是一个引用

函数返回值是一个引用的情况&#xff1a; 1.值是如何被返回的&#xff1a; 返回的值用于初始化调用点的一个临时量&#xff0c;该临时量就是函数调用的结果。 如果函数返回引用&#xff0c;则该引用仅是它所引对象的一个别名。 2.不能返回局部对象的引用或指针&#xff1a;…

java视频压缩 lz4_一种视频序列帧的压缩方法、解压方法及装置与流程

技术特征&#xff1a;1.一种视频序列帧的压缩方法&#xff0c;其特征在于&#xff0c;包括&#xff1a;在视频帧数据压缩时&#xff0c;对解析到的第一帧视频帧数据使用lz4算法进行压缩并保存至视频文件中&#xff1b;对之后解析到的每一帧视频帧数据都与之前一帧视频帧数据进行…

c++ 构造函数

构造函数&#xff1a; 类通过一个或几个特殊的成员函数来控制其对象的初始化进程&#xff0c;这些函数叫构造函数。构造函数的任务是初始化类对象的数据成员。 构造函数名字和类名相同&#xff0c;构造函数没有返回类型。构造函数也有一个可能为空的参数列表和一个可能为空的…

js java post提交_如何从Express.js发送Post请求到另一个服务器(Java)?

小编典典您正在重复请求&#xff0c;并为发布请求重新分配变量。我已经更新了您的代码并与requestb.in一起对其进行了测试var express require(express);var querystring require(querystring);var http require(http);var app express();app.get(/, function (req, res) {…

c++ 访问控制与封装

访问控制与封装 文章目录访问说明符&#xff1a;友元&#xff1a;封装好处&#xff1a;class Sales_data{public://作为接口的一部分&#xff0c;构造函数和部分成员函数isbn&#xff0c;combine紧跟在public说明符之后。Sales_data() default;Sales_data(const std::string &…

c++ 命名空间的using声明

命名空间的using声明&#xff1a; 除了内置类型之外&#xff0c;c语言还定义了一个内容丰富的抽象数据类型库。 访问库中名字的一个简单方法就是通过using。 我们用到的库函数基本上都属于命名空间std&#xff0c;可以通过::&#xff08;作用域操作符&#xff09;从左侧作用…

mysql工作中遇到的问题_MySQL工作中遇到的问题记录

1&#xff1a;log_slave_updates:从库1搭建级联从库2&#xff0c;从库1需要开启log_slave_updates&#xff0c;修改/etc/my.cnf&#xff0c;增加一行log_slave_updates1&#xff0c;重启数据库。http://blog.itpub.net/12679300/viewspace-1319263/2&#xff1a;ERROR 1418 (HY…

java 基本格式

java基本格式&#xff1a; 所有的java程序必须放在一个类之中才可以执行。 主方法main是整个java程序的入口&#xff0c;所有程序都是从public static void main(String[] args)开始运行的。 类定义有两种形式&#xff1a; public class:文件名和类名一致。每一个*.java文件…

用java画海绵宝宝_java 方法的重载

方法的重载&#xff1a;一个类中允许出现一个以上的同名方法&#xff0c;必须保证同名方法的参数列表不同好处&#xff1a;方便阅读&#xff0c;优化程序设计重载规则&#xff1a;重载方法名相同&#xff0c;但每个重载方法都必须有一个独一无二的参数类型列表&#xff0c;方法…

Java 构造方法

Java构造方法&#xff1a; 通过构造方法&#xff0c;在对象最初被创建时就完成对其成员变量的初始化。 构造方法特点&#xff1a; 构造方法名称和类名相同。构造方法不返回任何数据&#xff0c;也不用void声明。在创建对象时&#xff0c;系统自动调用类的构造方法。构造方法…

ajax 链接java_如何使用ajax将下拉菜单链接到表

以下是实现您的功能的示例静态代码 . 您可以使用sql和php添加动态内容 .的index.phpCource 1Cource 2Cource 3Cource 4$("#courses").change(function(){var course $(this).val();$.post(data.php, {course: course}, function(response){// your drop down box is…

Java 作用域修饰符

Java作用域修饰符 在java语言中&#xff0c;可以使用访问修饰符来规定对类、变量、方法和构造方法的访问。 文章目录一、访问修饰符二、非访问修饰符一、访问修饰符 1.私有的访问修饰符private&#xff1a; 声明为私有访问类型的变量只能通过类中的公共方法被外部类访问。 …

python xgboost实战_史上最详细的XGBoost实战

0. 环境介绍Python 版 本&#xff1a; 3.6.2操作系统  &#xff1a; Windows集成开发环境&#xff1a; PyCharm1. 安装Python环境安装Python首先&#xff0c;我们需要安装Python环境。本人选择的是64位版本的Python 3.6.2。去Python官网https://www.python.org/选择相应的版本…

java web导入tomcat_记一次在服务器上导入javaweb 项目的经历---tomcat服务器-Go语言中文社区...

1. 导入数据库远程linux服务器mysql数据库导入和导出.sql文件大部分情况本地开发环境为windows&#xff0c;部署的服务器为Linux&#xff0c;本地数据库导出.sql文件后需要远程导入服务器&#xff0c;具体如下。首先连接服务器&#xff0c;即服务器ip&#xff0c;协议&#xff…

Java 创建对象

Java 创建对象 声明&#xff1a;Person p1; 声明一个对象&#xff0c;包括对象名称&#xff08;p1&#xff09;和对象类型&#xff08;Person&#xff09;。 实例化&#xff1a;p1 new Person(); 使用关键字new创建一个对象。 声明和实例化连起来可以写成&#xff1a;Person …

java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text

Java标准教程&#xff1a;Java 2D绘图--第4章使用Text本节介绍文本API的用法&#xff0c;以及他们的渲染能力。至今为止&#xff0c;您已经有了基本的Java 2D文本API&#xff0c;同时知道如何设置字体和位置&#xff0c;以及绘制文本。本节扩展了这些知识&#xff0c;同时更深入…

java 对象引用传递

java对象引用传递 引用传递也称为传地址&#xff0c;实际参数的引用&#xff08;地址&#xff09;被传递给方法中对应的形式参数&#xff0c;在方法中&#xff0c;对形式参数的操作实际上就是对实际参数的操作&#xff0c;方法执行中形式参数改变将影响实际参数。 传引用的数据…

java 定义和导入包

java定义和导入包&#xff1a; 为了更好地组织类&#xff0c;java提供了包机制。把功能相似或相关的类或接口组织在同一个包中&#xff0c;方便类的查找和使用。同一个包中的类名不同&#xff0c;不同包中类名可以相同。同时调用两个不同包中相同类名的类时&#xff0c;应该加…