• C++ (Chapter 2)


    C++(二)

    1.缺省参数

    在C++中,在函数定义的时候,可以为形参指定一个默认值,也称作缺省值.如果在调用这个函数时没有传参,那么函数在执行的时候就采用该实参的缺省值,否则使用实参的值.

    例如:

    #include
    using namespace std;
    void Add(int x, int y = 10)
    {
    	cout << x + y << endl;
    }
    int main()
    {
    	Add(1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    此处在调用时值传递了一个参数,这个参数会赋值给第一个形参,第二个形参没有赋值,就会使用默认的10进行运算.

    假如我们为两个参数都指定值:

    #include
    using namespace std;
    void Add(int x, int y = 10)
    {
    	cout << x + y << endl;
    }
    int main()
    {
    	Add(1,2);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:
    在这里插入图片描述

    注意:当要给部分参数赋默认值时,要从右边到左边依次给参数赋默认值.如下:

    void Add(int x, int y = 10,int z = 10)
    {
    	cout << x + y + z << endl;
    }
    int main()
    {
    	Add(1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果:
    在这里插入图片描述

    void Add(int x, int y = 10,int z = 10)
    {
    	cout << x + y + z << endl;
    }
    int main()
    {
    	Add(10,20);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果:
    在这里插入图片描述

    注意:

    • 在函数的定义和声明中不能同时包含缺省参数,不然会发生冲突,在一个完整的项目中,缺省参数最好是出现在函数的声明中.
    • 缺省参数必须从右到左依次给,不能间隔着给.
    • 缺省值只能是全局变量或者是常量,但是在很多情况下,缺省值都是常量为主.
    • C语言不支持函数带有缺省值.

    2.函数重载

    在人们的自然语言中,一句话往往在不同的语境中会有不同的含义,特定的语境会有特殊的含义,即这句话被重载了.

    函数重载的概念:函数重载是函数的一种特殊状况,C++允许在同一个作用域中声明几个功能类似的同名函数.这些同名函数的形参列表(形参个数 或者 形参类型 或者 形参顺序 )不同.

    形参类型不同:

    #include
    using namespace std;
    void Add(double x, double y)
    {
    	cout << x + y << endl;
    }
    void Add(int x, int y )
    {
    	cout << x + y << endl;
    }
    int main()
    {
    	Add(10,20);
        Add(1.2, 3.4);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    形参个数不同:

    #include
    using namespace std;
    void Add(int x, int y)
    {
    	cout << x + y << endl;
    }
    void Add(int x, int y,int z)
    {
    	cout << x + y + z << endl;
    }
    int main()
    {
    	Add(10, 20,30);
    	Add(10,20);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    形参顺序不同:

    #include
    using namespace std;
    void Add(char x, int y)
    {
    	cout << x + y << endl;
    }
    void Add(int x, char y)
    {
    	cout << x + y << endl;
    }
    int main()
    {
    	Add('a', 20);
    	Add(10,'a');
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注意: 如果两个函数的形参列表相同,只是返回值不同是无法构成重载的.

    请看下面这种函数重载与缺省参数写法:看是否会报错呢??

    int Func(int x = 10)
    {
    	return x;
    }
    void Func()
    {
    	cout << "this is Func()" << endl;
    }
    int main()
    {
        Func();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编译是无法通过的,因为Func()调用时,不知道到底是调用无参函数,函数调用有缺省值的函数.

    为什么C++支持函数重载呢?

    因为C++编译器修饰函数之后会变成 [_Z+函数名所占用字符个数+函数名+类型首字母],例如我在test.c文件下写了这样一段代码:

    #include
    float Func(int x,float y)
    {
    	return x - y;
    }
    int Add(int x,int y)
    {
    	return x + y;
    }
    int main()
    {
    	float x = Func(3,2.1);
    	int y = Add(1,2);
    	printf("lf",x);
    	printf("%d",y);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    接着在linux环境下使用C和C++两种编译器,查看最后生成的.o文件

    使用C++编译方式:
    在这里插入图片描述
    在这里插入图片描述

    使用C语言编译方式:

    在这里插入图片描述
    在这里插入图片描述

    • 那么最后通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
  • 相关阅读:
    文件上传接口
    Gly-Phe-Leu, 15373-56-5
    webrtc入门:12.Kurento下的RtpEndpoint和WebrtcEndpoint
    openjudge_2.5基本算法之搜索_1789:算24
    1385:团伙(group)
    剑指offer-62-圆圈中最后剩下的数字
    JavaScript 触发浏览器页面全屏,某div区域全屏
    没有炫光的台灯有哪些?2023五款优秀护眼台灯
    量化交易学习笔记(9) 使用Hyperopt 对BOLL策略的超参数优化 横跨熊牛市实现百倍收益
    matebook14安装vmware导致多屏协同失败
  • 原文地址:https://blog.csdn.net/weixin_73906153/article/details/133806267