• 初识C++ (二)


    在这里插入图片描述
    要以一种很认真的态度去生活

    上节课输入输出问题的一些补充

    其实printf和cout之间并没有明显的优劣之分
    大家根据自己的需要 根据使用的方便程度自行选择就好

    一. 缺省参数

    我们这里先来看百度上的定义

    所谓缺省参数,顾名思义,就是在声明函数的某个参数的时候为之指定一个默认值,在调用该函数的时候如果采用该默认值,你就无须指定该参数。

    什么意思捏 好像还是有点不理解 那么我们来上代码

    我们写出下面这段代码

    void func(int a = 10)
    {
    	cout << "a:  " << a << endl;
    }
    
    • 1
    • 2
    • 3
    • 4

    我们再main函数里面运行一下试试看

    我们可以发现 咦 好像不使用参数也可以运行!

    在这里插入图片描述
    接下来我们试试看使用参数会有什么效果

    在这里插入图片描述

    接下来看看其他值怎么样

    20也是可以的

    在这里插入图片描述
    那么这里我们就可以发现一个规律了

    当我们在调用函数的时候不指定值的时候它就会使用我们函数定义时的默认值

    当我们在调用函数的时候指定值的时候使用的参数就是指定值

    1.1 半缺省参数

    半缺省参数即使缺省一部分的参数(注意这里并不是一半

    注意点!!!

    我们这里必须要从右往前缺省参数 以下格式是绝对不可以的

    在这里插入图片描述
    我们有代码如下

    void func2(int a , int b = 20, int c = 30)
    {
    	cout << "a: " << a << endl;
    	cout << "b: " << b << endl;
    	cout << "c: " << c << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    调用格式如下

    func2(10);
    
    • 1

    打印结果如下

    在这里插入图片描述

    1.2 全缺省参数

    比如说这样子的代码

    void func3(int a=10, int b = 20, int c = 30)
    {
    	cout << "a: " << a << endl;
    	cout << "b: " << b << endl;
    	cout << "c: " << c << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们可以有以下调用方式

    int main()
    {
    	func3();
    	func3(1);
    	func3(1,2);
    	func3(1,2,3);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    但是我们这里要注意的是

    像是这样子的调用是绝对不被允许的

    //func(, ,3)
    
    • 1

    因为我们的函数传参是严格按照从左到右的顺序
    在这里插入图片描述

    1.3 补充

    缺省参数不能声明定义都有! 只能有一个有

    二. 函数重载

    2.1 重载是什么意思?

    从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形

    也就是说 一个函数名可以对应多个函数

    那么我们要怎么区分这几个函数呢?

    2.2 如何区分重载函数

    参数类型不同

    例如下面两个函数

    void test1(int a)
    {
    	;
    }
    
    void test1(double a)
    {
    	;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    它们就是两个同名的重载函数

    参数个数不同

    例如下面这两个函数

    void test1(int a)
    {
    	;
    }
    
    void test1(int a , char b)
    {
    	;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参数顺序不同

    例如下面这两个函数

    void test1(int a , char b)
    {
    	;
    }
    
    void test1(char a, int b)
    {
    	;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    附加题1

    我们来思考下这两个函数

    它们是否是重载函数呢

    void test1()
    {
    	;
    }
    
    void test1(int a = 10)
    {
    	;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们这里传参的时候是不会报错的

    但是如果说不传参的话就会存在歧义

    对吧 两个都可以不传参调用 你要返回哪个呢?

    附加题2

    返回值不同 这里构成重载嘛?

    这个问题是不是和上面的一样啊

    我们怎么区分要调用哪个函数呢?

    2.3 c++支持函数重载的原理

    我们都知道 函数处理需要进行四个阶段

    预处理

    它的作用有四个

    头文件展开
    宏定义的替换
    条件编译
    去掉注释

    编译

    检查语法

    所以说我们的语法错误报错是在编译阶段报错的

    汇编

    转换成二进制指令

    连接

    合并段表
    符号表的合并和重定位

    这里主要问题出现在连接阶段

    为什么呢?

    因为在连接这一步合并符号表的时候

    在C语言中

    C语言将函数名作为一个符号表 所以说如果发现多个相同的函数名就会报错

    而在C++中

    C++在制作符号表的时候不仅会考虑函数名还会考虑参数等因素 所以说参数不同函数名相同也不会报错

    这就是C++支持函数重载的原理

    在这里插入图片描述

    总结

    本节课学习了缺省参数(包括半缺省和全却省)
    学习了重载函数(如何区分)
    简短的介绍了c++的函数重载原理

  • 相关阅读:
    动态规划算法(3)--0-1背包、石子合并、数字三角形
    STM32 学习——2. PWM
    7-MySQL函数
    02 powershell服务器远程执行命令
    JS数据类型的探究
    uniapp AES加密解密
    Mysql集群及高可用-并行复制5
    【UE 材质】制作飘动的旗帜
    node应用故障定位顶级技巧—动态追踪技术[Dynamic Trace]
    隆云通吸顶多参数传感器
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/127559197