当前位置: 首页 > article >正文

C++从入门到实战(三)缺省参数与函数重载

C++从入门到实战(三)缺省参数与函数重载

  • 前言
  • 一、缺省参数
    • (一)什么是缺省参数
    • (二)缺省参数的好处
      • 1. 缺省参数的优点
      • 2. 缺省函数与普通函数的对比
        • 2.1.缺省参数函数
        • 2.2.普通函数
        • 2.3.特性对比
    • (三)缺省参数的分类
      • 1.全缺省参数
      • 2.半缺省参数
    • (四)缺省参数注意事项
  • 二、函数重载
    • (一)什么是函数重载
    • (二)函数重载的判断规则
    • (三)函数重载与返回值类型
    • (四)函数重载的应用场景


前言

  • 上一节我们深入探讨了 C++ 的命名空间,了解到它在解决命名冲突、构建大型程序结构方面的重要作用
  • 上一节的博客地址

https://blog.csdn.net/2402_83322742/article/details/145346987?spm=1001.2014.3001.5501

  • 这一节,我们将聚焦于 C++ 中另外两个重要特性缺省参数函数重载。掌握这两个特性,能让我们编写出更具灵活性和高效性的代码,为构建复杂的 C++ 应用程序打下坚实基础。

一、缺省参数

(一)什么是缺省参数

  • 缺省参数是指在定义函数时,为函数的参数指定一个默认值
void Func(int a = 0)
{
	cout << a << endl;
}

在调用函数时

Func();
Func(100);
Func1();
Func1(1);

这样便是简单的缺省函数

(二)缺省参数的好处

1. 缺省参数的优点

  • 1.调用简便:调用Func();当无传参时,会调用默认值,当有传参时,会调用传参值,适合多数场景用固定值的情况,省事。
  • 2.维护轻松:若改默认值,只在函数定义处改,调用处自动更新,不易出错

2. 缺省函数与普通函数的对比

2.1.缺省参数函数
#include <iostream>

// 定义一个带缺省参数的函数
void printNumber(int num = 0) 
{
    std::cout << "Number: " << num << std::endl;
}

int main() 
{
    // 不传入参数,使用默认值
    printNumber(); 
    // 传入自定义参数
    printNumber(10); 
    return 0;
}
  • 在这个例子中,printNumber 函数的参数 num 有默认值 0。调用 printNumber() 时,会使用默认值 0;调用 printNumber(10) 时,会使用传入的 10
2.2.普通函数

普通函数在调用时必须传入所有参数,没有默认值的选项

#include <iostream>

// 定义一个普通函数
void printNumberNormal(int num) 
{
    std::cout << "Number: " << num << std::endl;
}

int main() {
    // 必须传入参数
    printNumberNormal(20); 
    return 0;
}
  • 这里的 printNumberNormal 函数在调用时,必须传入一个整数作为参数,否则会编译错误。
2.3.特性对比

在这里插入图片描述

(三)缺省参数的分类

1.全缺省参数

1.全缺省参数:函数的所有参数都有缺省值。例如:

void setValue(int a = 1, int b = 2, int c = 3) 
{
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
}

调用时可以有多种方式:

int main() 
{
    setValue(); // a = 1, b = 2, c = 3
    setValue(10); // a = 10, b = 2, c = 3
    setValue(10, 20); // a = 10, b = 20, c = 3
    setValue(10, 20, 30); // a = 10, b = 20, c = 30
    return 0;
}

2.半缺省参数

2.半缺省参数:函数部分参数有缺省值。注意,半缺省参数必须从右往左依次定义。例如:

void printNumbers(int a, int b = 20, int c = 30) 
{
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
}
int main() 
{
    printNumbers(10); // a = 10, b = 20, c = 30
    printNumbers(10, 25); // a = 10, b = 25, c = 30
    printNumbers(10, 25, 35); // a = 10, b = 25, c = 35
    return 0;
}

(四)缺省参数注意事项

  • 1.缺省值必须是常量或者全局变量:

不能使用局部变量作为缺省值,因为局部变量的生命周期在函数结束时就结束了,无法在函数调用时提供有效的默认值。

// 错误示例
void wrongFunction(int a = localVar) 
{ 
   // localVar是局部变量,错误
    std::cout << "a = " << a << std::endl;
}

int main() {
    int localVar = 10;
    wrongFunction();
    return 0;
}
  • 2.在函数声明和定义中都有缺省参数时,声明和定义不能同时出现缺省参数:通常建议在函数声明中指定缺省参数,因为函数声明通常在头文件中,更容易被调用者看到
// 在头文件中声明
void correctFunction(int a = 10); 

// 在源文件中定义
void correctFunction(int a) 
{
    std::cout << "a = " << a << std::endl;
}

二、函数重载

(一)什么是函数重载

在同一作用域内,可以定义多个同名函数,这些函数的参数列表(参数个数、参数类型或参数顺序)不同,这就是函数重载。

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

int add(int a, int b, int c) {
    return a + b + c;
}
  • 在上述代码中,定义了三个名为add的函数,它们的参数列表不同,分别是两个int类型参数、两个double类型参数和三个int类型参数。
  • 调用时,编译器会根据传入的实参类型和个数来决定调用哪个函数:

(二)函数重载的判断规则

  • 1.参数个数不同

如上面add函数示例中,两个参数的add函数和三个参数的add函数构成函数重载。

  • 2.参数类型不同

两个int类型参数的add函数和两个double类型参数的add函数构成函数重载

  • 3.参数顺序不同
void printValue(int a, double b) 
{
    std::cout << "int: " << a << ", double: " << b << std::endl;
}

void printValue(double a, int b) 
{
    std::cout << "double: " << a << ", int: " << b << std::endl;
}

(三)函数重载与返回值类型

需要注意的是,仅仅返回值类型不同,不能构成函数重载

// 错误示例,仅返回值类型不同,不构成函数重载
int getValue() 
{
    return 10;
}

double getValue() 
{
    return 10.5;
}
  • 编译器在调用函数时,是根据函数名和参数列表来确定调用哪个函数的,而不是返回值类型。2
  • 如果仅返回值类型不同,编译器无法根据函数调用语句确定调用哪个函数。

(四)函数重载的应用场景

1.提高代码的可读性和可维护性:

当我们需要实现功能类似但处理的数据类型或参数个数不同的操作时,使用函数重载可以让代码看起来更直观。例如,对于不同类型数据的加法操作,使用同一个函数名add,调用者更容易理解代码的意图。

2.增强代码的灵活性:

通过函数重载,可以根据不同的输入情况,提供不同的处理方式,使代码能够适应更多的应用场景。


以上就是这篇博客的全部内容,下一篇我们将继续探索 C++ 的更多精彩内容。

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述


http://www.kler.cn/a/545795.html

相关文章:

  • 排序--四种算法
  • 劳动争议调解系统(源码+文档+部署+讲解)
  • uniapp在地图上加载CAD图,标记区域网格,加载geojson数据
  • 图像锐化(QT)
  • Qt中2个.app源文件之间函数与变量的互相调用
  • 【工业安全】-CVE-2022-35561- Tenda W6路由器 栈溢出漏洞
  • @Transational事务注解底层原理以及什么场景事务会失效
  • C++设计模式-工厂模式
  • 什么是服务的雪崩、熔断、降级的解释以及Hystrix和Sentinel服务熔断器的解释、比较
  • OpenWebUI使用DeepSeek R1满血版,DeepSeek R1 API调用
  • 《C++ Primer》学习笔记(一)
  • 【目标检测json2xml】label从COCO格式json文件转VOC格式xml文件
  • 关于post和get的请求参数问题
  • Vue 3 30天精进之旅:Day 22 - 构建和部署
  • windows 打开22端口
  • DeepSeek自然语言处理(NLP)基础与实践
  • dify.ai 配置链接到阿里云百练等云厂商的 DeepSeek 模型
  • 真正通俗易懂的Langchain入门学习(二)
  • Kotlin 扩展函数与内联函数
  • DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件