【C++小语法技巧】缺省参数和函数重载

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

目录

前言

一、缺省参数

1.默认参数规则:

2.全缺省和半缺省

二、函数重载

函数重载前提:

区分:参数列表不同,包括参数的类型、个数、类型顺序不同


前言

在使用C语言编程过程中,C语言的要求之严格,编程过程之繁琐,大同小异的重复性工作,令C++之父使用C语言编程时也深受其扰,于是乎C++兼容C小语法诞生了

前一篇:【C++小语法技巧】命名空间和输入输出http://t.csdnimg.cn/qgJde

文章均已收录至【C++专栏】,可放心食用

一、缺省参数

在C++中,缺省参数(也称为默认参数)允许在定义函数时为参数指定一个默认值。如果在调用函数时没有提供这个参数的值,那么就会使用默认值。

1.默认参数规则:

(1)只能从左往右传实参,形参只能从右往左缺省

(2)不能在函数声明和函数定义同时给默认参数(一般在函数声明时给)

2.全缺省和半缺省

(1)全缺省:全部参数都设置默认值

(2)半缺省:部分参数设置默认值

代码示例:

#include <iostream>
using namespace std;
//全缺省
void printNumbers(int number1 = 1, int number2 = 2) 
{
        cout << "Number 1: " << number1 << ", Number 2: " << number2 << endl;
}
//半缺省
void fun(int a, int b=5)
{
    cout << "a=" << a << ",b=" << b << endl;
}

int main() {
    // 调用函数时提供所有参数
    printNumbers(10, 20);

    // 调用函数时省略第二个(使用默认值)
    printNumbers(40);

    // 调用函数时不提供任何参数(使用所有默认值)
    printNumbers();

    // 调用函数时提供所有参数
    fun(10, 20);
    // 调用函数时省略第二个(使用默认值)
    fun(10);
    //fun();//错误a没有默认值,缺少实参
    return 0;
}

运行结果:

760666e772404675877780dff92fda33.png

二、函数重载

函数重载(Function Overloading)简单来说,它允许我们在同一个作用域内定义多个具有相同名称但参数列表不同的函数。

函数重载前提:

1.同一作用域

2.函数名相同

3.功能类似

区分:参数列表不同,包括参数的类型、个数、类型顺序不同

注:函数返回类型不能区分函数重载

问:为什么c不支持函数重载,c++怎么支持函数重载?

答:首先我们要知道编译的四个过程:

预处理->编译->汇编-> 链接

简单来说:C语言不支持函数重载是因为在连接时直接使用函数名来对函数进行查找

C++是使用修饰过后的函数名(包含函数参数信息)来查找

详细回答如下:

C语言不支持函数重载的原因主要在于其编译后的函数名处理机制。C语言在编译后,会将函数名转化为一个唯一的标识符(通常是在函数名前加上一个下划线),这个标识符在链接阶段用于确定函数的具体实现。由于这个机制并不区分函数的参数类型或数量,所以当存在多个同名但参数不同的函数时,编译器无法区分它们,从而导致编译错误。

然而,C++语言则通过一种称为“名字修饰”(Name Mangling)的技术来支持函数重载。在C++中,编译器在编译过程中会对函数名进行修饰,这种修饰会包含函数的参数类型、数量等信息。因此,在C++中,即使函数名相同,只要参数列表不同(包括参数类型、数量或顺序的不同),那么它们就会被视为不同的函数,从而实现了函数重载。

具体来说,C++编译器在编译时,会将函数名和参数信息一起进行编码,生成一个独一无二的“修饰名”。这个修饰名在链接阶段用于确定函数的具体实现。由于修饰名中包含了函数的参数信息,所以即使函数名相同,只要参数列表不同,它们的修饰名也会不同,从而实现了函数重载。

代码示例:

#include <iostream>
using namespace std;
// 第一个重载函数,无参数
void sayHello() {
    cout << "Hello, world!" << endl;
}

// 第二个重载函数,接受一个int类型的参数
void sayHello(int times) {
    for (int i = 0; i < times; ++i) {
        cout << "Hello, " << i + 1 << " time!" << endl;
    }
}

// 第三个重载函数,接受一个double类型的参数,表示某种权重或值
void sayHello(double weight) {
    cout << "Hello with weight: " << weight << endl;
}

int main() {
    sayHello();
    sayHello(3);
    sayHello(1.5);
    return 0;
}

运行结果:

c9f19460bcc4417f9397597052bcd5ba.png

欢迎大家一起学习交流,有错误可以指正

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值