前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++小语法技巧】缺省参数和函数重载

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

原创
作者头像
池央
发布2024-11-16 18:31:54
30
发布2024-11-16 18:31:54
举报
文章被收录于专栏:好事连连

好事发生

mall :hutool项目源码解析 作者:忆遂愿

https://cloud.tencent.com/developer/article/2466055?shareByChannel=link

文章通过实际项目需求引导对 Hutool 的学习,在工具类介绍环节,依据不同工具类在控制层接口的应用以及控制台打印信息进行讲解,同时紧密关联官方开发文档,为读者自主深入研究提供了清晰的指引路径,非常有帮助。


前言

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

一、缺省参数

在C++中,缺省参数(也称为默认参数)允许在定义函数时为参数指定一个默认值。如果在调用函数时没有提供这个参数的值,那么就会使用默认值。 1.默认参数规则: (1)只能从左往右传实参,形参只能从右往左缺省 (2)不能在函数声明和函数定义同时给默认参数(一般在函数声明时给) 2.全缺省和半缺省 (1)全缺省:全部参数都设置默认值 (2)半缺省:部分参数设置默认值

代码示例:

代码语言:javascript
复制
#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;
}

3.默认参数的优势

3.1 提高函数的灵活性

缺省参数使得函数在调用时可以根据具体情况选择是否提供特定参数的值。这在很多场景下非常有用,比如有一个函数用于绘制图形,它可能有多个参数来控制图形的颜色、大小、位置等。对于一些简单的使用场景,用户可能只关心图形的形状,此时就可以利用缺省参数为颜色、大小等参数设置默认值,让用户在调用函数时无需为这些不太关注的参数一一赋值,从而使函数的调用更加便捷和灵活。

3.2代码的可维护性和可读性

当函数有多个参数且部分参数在大多数情况下使用固定的值时,通过设置缺省参数,可以让函数的调用更加清晰明了。其他阅读代码的人可以很容易地看出哪些参数是可以根据具体需求灵活调整的,哪些参数在通常情况下使用默认值即可。而且,如果后续需要修改默认值,只需要在函数声明处进行修改,而不需要在每一处调用该函数的地方都进行调整,这大大提高了代码的可维护性。

二、函数重载

函数重载(Function Overloading)简单来说,它允许我们在同一个作用域内定义多个具有相同名称但参数列表不同的函数。 函数重载前提: 1.同一作用域 2.函数名相同 3.功能类似 区分:参数列表不同,包括参数的类型、个数、类型顺序不同 注:函数返回类型不能区分函数重载 问:为什么c不支持函数重载,c++怎么支持函数重载? 答:首先我们要知道编译的四个过程: 预处理->编译->汇编-> 链接 简单来说:C语言不支持函数重载是因为在连接时直接使用函数名来对函数进行查找 C++是使用修饰过后的函数名(包含函数参数信息)来查找

详细回答如下:

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

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

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

代码示例:

代码语言:javascript
复制
#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;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、缺省参数
    • 3.默认参数的优势
      • 3.1 提高函数的灵活性
      • 3.2代码的可维护性和可读性
  • 二、函数重载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档