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

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++ 的更多精彩内容。

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

在这里插入图片描述

相关文章:

  • Navicat导入海量Excel数据到数据库(简易介绍)
  • Spring 项目接入 DeepSeek,分享两种超简单的方式!
  • Redis7.0八种数据结构底层原理
  • HTML的入门
  • Vue笔记(十)
  • 深度剖析责任链模式
  • 游戏引擎学习第100天
  • 走进 Tcl 语言:历史、特性与应用
  • C++ ——从C到C++
  • C++,STL容器适配器,stack:栈深入解析
  • docker compose部署flink集群
  • 【Vue中BUG解决】npm error path git
  • macOS 上部署 RAGFlow
  • 【经验分享】Linux 系统安装后内核参数优化
  • 微信小程序医院挂号系统
  • Visual Studio踩过的坑
  • Mac上搭建宝塔环境并部署PHP项目
  • 侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用
  • 【深入探讨 ResNet:解决深度神经网络训练问题的革命性架构】
  • Qt Designer菜鸟使用教程(实现一个本地英文翻译软件)
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判
  • 莫高义在第四届中国新闻发言人论坛开幕式上的致辞
  • 用贝多芬八首钢琴三重奏纪念风雨并肩20年
  • 第一集|好饭不怕晚,折腰若如初见
  • 在稳市场稳预期下,投资者教育给了散户更多底气
  • 福建厦门市副市长、市公安局局长陈育煌出任吉林省公安厅厅长