首页 > 编程语言 >C++函数高级

C++函数高级

时间:2023-04-09 16:37:34浏览次数:37  
标签:调用 函数 高级 C++ 参数 默认值 我们 传值


目录

一.函数的默认参数

1.默认参数的性质  

2.函数默认参数的注意事项

二.函数的占位参数

三.函数的重载   

1.重载的性质和条件

(1)修改参数的个数

(2)修改参数的类型

(3)修改参数的顺序

2.函数重载的注意事项 

(1)当引用&作为函数参数

(2)不可以用函数的默认参数作为重载条件 


一.函数的默认参数

1.默认参数的性质  

        在接触函数函数之前,我们使用函数时形式参数都只是定义了并没有定义的同时初始化,但其实函数的形式参数是可以定义的同时初始化的,也就是形式参数可以有默认值,这时形式参数的默认值称之为函数的默认参数

        函数默认参数的性质为:

(1)当函数有默认参数时,该参数可以不传值,则该参数的值就为默认值,当给该参数传值时,传的值会将默认值覆盖,即修改形参

(2)没有默认值的参数则必须传参

(3)当函数有多个参数并且有默认参数时,当调用时传值的个数小于函数参数个数时,会优先给无默认值的参数传值

        我们以最简单的打印函数为例

C++函数高级_函数重载

 输出结果

C++函数高级_函数重载_02

我们可以看到,在主函数调用func函数并给函数传实参,a的值进行了修改并打印 

        在上面的基础上,我们定义形参a时给其初始化

C++函数高级_函数重载_03

 输出结果

C++函数高级_函数重载_04

        程序运行的过程为,形参a的默认值为10,在主函数调用并传值20给函数,形参a的值修改为20并打印,当函数形参有默认值时,可以调用时不给函数传值,则形参的值就是默认值

C++函数高级_默认参数_05

 输出结果

C++函数高级_默认参数_06

可以看到,即使我们不给函数传值,函数依然调用成功并将形参a的默认值打印 

        我们在此基础上给函数多个参数,当函数有多个参数时,有默认值的参数可以不传值,但是无默认值的参数必须传值,当传值的个数少于参数个数时,会优先给无默认值的形参传值

C++函数高级_函数重载_07

 输出结果

C++函数高级_函数重载_08

 当我们不给无默认值的参数传值时

C++函数高级_默认参数_09

 编译器报错信息

C++函数高级_默认参数_10

         报错信息是因为函数中形参a没有默认值,就必须传值

         经过上述验证,我们基本验证了函数的默认参数的性质

2.函数默认参数的注意事项

        函数有多个参数,当我们给一个参数默认值时,则这个参数后面的所有参数都必须有默认值

        我们依然以上面的函数为例,我们给函数三个形参

C++函数高级_默认参数_11

 输出结果

C++函数高级_默认参数_12

可以看到我们正常输出了,下面我们只给a默认值,而b,c没有默认值

C++函数高级_默认参数_13

 编译器报错信息

C++函数高级_函数重载_14

 编译器报错信息显示默认实参不在形参列表。这是因为我们a之后的参数没有默认值导致的,我们给三个参数默认值试试

C++函数高级_默认参数_15

 输出结果

C++函数高级_函数重载_16

 可以看到正常输出了,当我们只给c默认值试试

C++函数高级_函数重载_17

 输出结果

C++函数高级_默认参数_18

      可以看到也正常输出了,这是因为c就是最后一个参数,后面没有参数了,假如c后面有参数,则c后面的参数也必须要有默认值

        经过上述验证,我们基本验证,有默认值的参数后面的参数也必须要有默认值

二.函数的占位参数

        占位参数,顾名思义就是一个参数占了个位置,就比如我们在火车站等车时,要去上厕所就会将自己的书包放在座位上好占个位置,别人看到你的书包就知道这个作为有人,但并不知道这个人是谁

        占位参数的性质:占位参数没有默认值的时候必须给它传值,当占位参数有默认值时,可以不给它传值

        我们依然以上面的函数为例

C++函数高级_默认参数_19

可以看到我们定义了两个参数,但是第二个参数没有名字也没有初始值

输出结果

C++函数高级_默认参数_20

 可以看到我们正常输出了,我们不给占位参数传值试试

C++函数高级_函数重载_21

编译器报错信息

C++函数高级_默认参数_22

        报错信息显示函数调用的参数太少,这就是因为我们没有给占位参数传值,但是当占位参数有默认值时,按照默认参数的性质,可以不给占位参数传值

C++函数高级_函数重载_23

 输出结果

C++函数高级_函数重载_24

        经过上述验证,我们基本验证占位参数的性质:占位参数没有默认值的时候必须给它传值,当占位参数有默认值时,可以不给它传值

三.函数的重载   

1.重载的性质和条件

        函数的重载主要应用于函数重复命名的问题,增强程序的复用性

        函数重载有以下三个条件:

(1)两个函数的作用域相同;

(2)两个函数的名字相同

(3)两个函数参数的类型或者参数的个数或者参数的顺序不同

        当两个函数满足上面三个条件时,我们就说两个函数可以产生重载,即这两个相同名字的函数可以同时存在和调用且互不影响

        我们一一来验证上面的条件

C++函数高级_函数重载_25

         当我们定义两个一模一样的函数,在主函数调用时,编译器傻了,因为调用func()时上面两个函数都符合,编译器不知道该调用哪个,我们来看编译器报错信息

C++函数高级_函数重载_26

        编译器显示void func函数已有主体,这就是我们定义两个一模一样的函数导致的,由于在同一个源文件中,函数的作用域相等,故我们只修改第三个条件,下面我们来修改其中一个函数的参数

(1)修改参数的个数

C++函数高级_函数重载_27

        第一个函数参数个数为0,第二个函数个数为1,当我们在主函数调用func()时,大家可以猜下会调用哪个函数呢,结果肯定是第一个没有参数的函数,因为调用时没有传参

输出结果

C++函数高级_默认参数_28

输出的没有参数的函数的结果

我们在调用时传一个参数,则会调用第二个参数个数为1的函数

C++函数高级_默认参数_29

输出结果

C++函数高级_函数重载_30

可以看到当我们调用时传了一个参数,结果是参数个数为1的函数的结果 

(2)修改参数的类型

        我们在第一个函数定义一个int型的参数,在第二个函数定义一个double型的参数,我们在调用时根据传的值的类型决定调用哪个参数

我们在调用时传整形的值

C++函数高级_默认参数_31

输出结果为参数类型为整形的函数的结果 

C++函数高级_默认参数_32

 我们在调用时传double的值

C++函数高级_默认参数_33

输出结果为参数类型为double的函数的结果

C++函数高级_默认参数_34

(3)修改参数的顺序

        我们依然以上面的函数为例,第一个函数我们先定义一个int型的参数再定义一个double的参数,第二个函数我们先定义一个double型的参数再定义一个int型的参数

        我们在调用时传一个int型的参数和double的参数

C++函数高级_默认参数_35

 输出结果为参数类型为 int double的函数的结果

C++函数高级_默认参数_36

 我们在调用时传一个idouble型的参数和int的参数

C++函数高级_默认参数_37

  输出结果为参数类型为  double int的函数的结果

C++函数高级_默认参数_38

        经过上述验证,当两个函数满足上面三个条件时,可以产生函数重载

2.函数重载的注意事项 

(1)当引用&作为函数参数

        当引用&作为函数参数时,有无const修饰决定调用函数的不同

我们在调用函数时传入变量a

C++函数高级_函数重载_39

输出结果为参数为int型的参数

C++函数高级_默认参数_40

        之所以传入一个int型的值不调用第二个用const修饰引用,是因为const修饰一个变量后,该变量就变为已读,可以近似看成一个常量,当我们调用时传入一个常量

C++函数高级_默认参数_41

 输出结果就变为了第二个用const修饰参数的函数的结果

C++函数高级_默认参数_42

(2)不可以用函数的默认参数作为重载条件 

        当一个两个参数的函数有一个默认参数,而另一个一个参数的函数没有默认参数时,在主函数调用时,编译器也会因为二义性而报错

C++函数高级_默认参数_43

        当我们在主函数调用func(10)的时候,由上面默认参数的性质可以知道,两个函数都满足调用条件,故编译器因为二义性报错

C++函数高级_函数重载_44

        报错信息显示有多个重载函数符合调用条件,即调用不明确,我们在日常编程中应避免这种二义性        


标签:调用,函数,高级,C++,参数,默认值,我们,传值
From: https://blog.51cto.com/huangchaohc/6178887

相关文章

  • 分享10个高级sql写法
    本文主要介绍博主在以往开发过程中,对于不同业务所对应的sql写法进行归纳总结而来。进而分享给大家。本文所讲述sql语法都是基于MySql8.0+博主github地址:http://github.com/wayn111 欢迎大家关注,点个star一、ORDERBYFIELD()自定义排序逻辑MySql中的排序ORDERBY......
  • C++内存对齐
    0x1什么是内存对齐,为什么需要它?尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,4字节,8字节,16字节甚至32字节为单位来存取内存,这些存取单位称为内存存取粒度。现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4......
  • Golang回调函数
    Golang回调函数实例二则定义回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于......
  • 内存函数
    今日份学习“内存函数”前言:当我们了解字符串相关函数可以对一系列的字符串进行操作,但这些函数只针对于字符串操作且太局限性了,所以为了破开这个局限性,该篇文章将介绍的函数就能解决这个问题。我们知道字符串相关的函数肯定是对字符串的每个字符进行操作控制的,每个字符且只占一个字......
  • 一文弄懂Python中的sort和sorted函数
    1.引言Python中的sort()和sorted()函数主要用于按升序或降序对数据进行排序。在本文中比较用于列表时,两个函数在编程和语法上的差异。闲话少说,我们直接开始吧!2.Sort()函数基本用法用于列表排序的sort函数的语法如下:list.sort(reverse=False,key=None)用法如下:参数reverse:默认为......
  • 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习
     其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维。RuntimeError:onlybatchesofspatialtargetssupported(3Dtensors)butgottargetsofdimension:4查看代码报错点,是出现在pytorch计算交叉熵损失的代码。其实在......
  • C语言的回调函数原来这么简单
    手机端阅读:C语言的回调函数原来这么简单 了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们希望代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加......
  • 新概念2册L80笔记(复习比较级和最高级)
    L80TheCrystaiPalace单词理解语法理解比较级/最高级区分高下比较(Lesson8Thebestandtheworst)例句:YiistallerthanLin例句:ThisistheworsthandwritingIhaveeverseenn.+erthan.../the比较级then.+estof/in最高级,of是对象范围,in环境范围规则变化:直接+er、......
  • C++伪随机数
    直接上代码吧用的是vs2019#include<iostream>usingnamespacestd;intmain(){ //系统生成随机数//rand()%100生成0~99 srand(time(NULL));//随机数种子,不加这行下一行就是伪随机数 intrandom_num=rand()%100+1;//1-100; //cout<<random_nu......
  • C++ map注意事项
    std::map<int,std::string>map;判断key是否存在时不能使用:std::stringstr=map[9];  //这样不存在时会新增!!!需要这样判断:std::map<int,std::string>::interatoriter;iter=map.find(9);if(iter!=map.end())  //存在else//不存在......