【C++】缺省(默认)参数

news2024/12/23 4:21:07

🦄个人主页:小米里的大麦-CSDN博客

🎏所属专栏:C++_小米里的大麦的博客-CSDN博客

🎁代码托管:C++: 探索C++编程精髓,打造高效代码仓库 (gitee.com)

⚙️操作环境:Visual Studio 2022

目录

一、概念

二、 全缺省(Fully Defaulted Parameters)

三、半缺省(Partially Defaulted Parameters)

四、缺省参数  VS  typedef

优劣对比

适用场景:

代码示例对比:

总结 

共勉


一、概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。在C++中,缺省参数也叫默认参数,主要就是指函数在声明时可以为参数提供一个默认值。如果调用函数时未传递该参数,编译器会使用提供的默认值。根据传递参数的情况,可以分为全缺省半缺省

规则结论注意:

  • 半缺省参数必须从右往左依次来给出,不能间隔着给,例如,不允许第一个参数有默认值,第二个参数没有。
  • 如果某个参数有默认值,在后面的所有参数也必须有默认值。
  • 缺省参数不能在函数声明和定义中同时出现。如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。
  • 只能在函数声明中定义,不能在函数定义体中重复定义。
  • 缺省值必须是常量或者全局变量
  • C语言不支持(编译器不支持)

二、 全缺省(Fully Defaulted Parameters)

全缺省是指函数的所有参数都有默认值。在调用函数时,调用者可以选择不传递任何参数。

代码示例:

#include <iostream>

void display(int a = 10, int b = 20) {
    std::cout << "a: " << a << ", b: " << b << std::endl;
}

int main() {
    display();  // 使用全部默认参数: a = 10, b = 20
    return 0;
}
在这个例子中,display函数的两个参数 a 和 b 都有默认值,
因此可以直接调用 display() 而不传入任何参数。
#include <iostream>

// 所有参数都有默认值
void printMessage(std::string message = "Hello", int times = 1) {
    for (int i = 0; i < times; ++i) {
        std::cout << message << std::endl;
    }
}

int main() {
    printMessage(); // 使用 "Hello" 和 1
    printMessage("Hi"); // 使用 "Hi" 和 1
    printMessage("Hi", 3); // 使用 "Hi" 和 3
    return 0;
}
在这个例子中,函数 printMessage 可以在没有参数、只有一个参数或传递所有参数的情况下被调用。

三、半缺省(Partially Defaulted Parameters)

半缺省是指函数部分参数有默认值,调用时可以省略部分参数,但必须从右向左按顺序省略。也就是说,左边的参数如果没有默认值,调用时必须传递。

#include <iostream>

void display(int a, int b = 20) {
    std::cout << "a: " << a << ", b: " << b << std::endl;
}

int main() {
    display(5);  // 使用部分默认参数: a = 5, b = 20
    return 0;
}
在这个例子中,display的第一个参数 a 没有默认值,调用时必须传入 a 的值,
但第二个参数 b 有默认值,因此可以省略。
#include <iostream>

// 只有第二个参数有默认值
void displayInfo(std::string name, int age = 18) {
    std::cout << "Name: " << name << ", Age: " << age << std::endl;
}

int main() {
    displayInfo("John"); // 使用 "John" 和 18
    displayInfo("Alice", 25); // 使用 "Alice" 和 25
    return 0;
}
在这个例子中,name 参数没有默认值,调用时必须提供;
而 age 参数有默认值,因此可以省略。

错误示例:缺省参数同时出现在声明和定义中

#include <iostream>

// 函数声明:这里为参数 b 提供了默认值 20
void display(int a, int b = 20);

// 函数定义:这里又为参数 b 提供了不同的默认值 30
void display(int a, int b = 30) {
    std::cout << "a = " << a << ", b = " << b << std::endl;
}

int main() {
    display(5);  // 编译器不知道该使用 b = 20 还是 b = 30
    return 0;
}

正确示例:将缺省参数仅放在声明中

#include <iostream>

// 函数声明:为参数 b 提供默认值 20
void display(int a, int b = 20);

// 函数定义:不再为参数 b 提供默认值
void display(int a, int b) {
    std::cout << "a = " << a << ", b = " << b << std::endl;
}

int main() {
    display(5);       // 使用 a = 5, b = 20(默认值)
    display(5, 15);   // 使用 a = 5, b = 15(传递了第二个参数)
    return 0;
}

四、缺省参数  VS  typedef

typedef 是一种为现有类型定义别名的方式,与缺省参数属于不同的概念。两者对比如下:

  • 功能不同:缺省参数是给函数参数提供默认值,typedef 则是为复杂或常用的类型提供别名。
  • 用途不同:缺省参数用于减少函数调用时传参的复杂性,而 typedef 则用于简化代码中的类型定义。

优劣对比

  • 缺省参数的优点

    • 可以简化函数的调用,使代码更具可读性和灵活性。
    • 在设计库或框架时,通过默认参数为用户提供合理的默认行为。
  • 缺省参数的缺点

    • 过度使用可能导致代码难以理解,尤其是在多个重载函数之间混用默认参数时。
    • 改变默认值可能导致已有代码的行为发生变化,维护起来要小心。
  • typedef的优点

    • 可以简化复杂类型(如指针、函数指针、模板实例)的书写,使代码更加简洁明了。
    • 提高代码的可维护性,修改类型定义时只需改动一处。
  • typedef的缺点

    • 别名可能降低代码的直观性,尤其是在大量使用别名的情况下。

适用场景:

  • 缺省参数主要用于函数参数的简化和灵活调用。
  • typedef主要用于定义复杂类型的别名,简化类型声明的书写,特别是在涉及到指针和模板时。

代码示例对比:

使用缺省参数的例子:

#include <iostream>

void display(int a = 10, int b = 20) {
    std::cout << "a = " << a << ", b = " << b << std::endl;
}

int main() {
    display();       // 输出 a = 10, b = 20(使用默认值)
    display(5);      // 输出 a = 5, b = 20(a被赋值为5,b使用默认值)
    display(5, 15);  // 输出 a = 5, b = 15(两者都传递了参数)
    return 0;
}

使用 typedef 的例子: 

#include <iostream>

// 定义一个函数指针类型,接受两个 int 参数,返回 int
typedef int (*Operation)(int, int);

// 两个简单的函数
int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

void displayResult(Operation op, int x, int y) {
    std::cout << "Result: " << op(x, y) << std::endl;
}

int main() {
    Operation op1 = add;         // 使用 typedef 定义的函数指针
    Operation op2 = multiply;    // 使用另一个函数

    displayResult(op1, 3, 4);    // 输出 Result: 7
    displayResult(op2, 3, 4);    // 输出 Result: 12
    return 0;
}

总结 

参数参数(默认参数)是C++中的一个强大功能,允许简化我们的函数调用,减少重复代码。当参数的默认值满足大多数情况下的需求时,它可以大幅提升代码的吸引力,全缺省和半缺省的区别在于函数调用的灵活性与复杂性,全缺省更为简单,而半缺省提供了更多的可控性。

typedef比较中,参数注重于函数接口的设计,而typedef着眼于简化类型声明。两者都有适用的场景,但都致力于提升代码的简洁性和可维护性。合理地运用这两者,可以帮助开发者编写更高效且简洁的代码。

最终,在开发中要根据具体的需求选择最合适的工具,无论是相关参数还是typedef,都能够极大地提高代码的质量和可维护性。

共勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多态的相关知识

一.多态的概念 1.多态&#xff1a;多态是⼀个继承关系的下的类对象&#xff0c;去调⽤同⼀函数&#xff0c;产⽣了不同的⾏为。 2.多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 1>编译时多态(静态多态)主要就是函数重载和函数模板&#xff0c;他们传不同类型的…

Powerpaint介绍及实现局部重绘效果测试[comfyui]

&#x1f358;背景 powerpaint&#xff0c;是一个高质量多功能的图像修补模型&#xff0c;可以同时支持插入物体、移除物体、图像扩展、形状可控的物体生成。 这个模型也是国产的&#xff0c;原作者是清华大学深圳国际研究生院&#xff0c;清华大学 &#xff0c;上海人工智能…

JAVA:非对称加密技术的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 非对称加密是一种加密技术&#xff0c;使用一对密钥进行数据加密和解密。这两个密钥分别是公开密钥&#xff08;public key&#xff09;和私有密钥&#xff08;private key&#xf…

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2&#xff09;比较含退格的字符串 .1- 题目解析 .2- 代码编写 3&#xff09;基本计算器 II .1- 题目解析 .2- 代码编写 4&…

进程状态、进程创建和进程分类

文章目录 进程进程常见的状态进程调度进程状态变化关系 进程标识示例--进程标识的使用以及简介 进程创建fork函数vfork函数示例--使用fork函数创建子进程&#xff0c;并了解进程之间的关系 创建进程时发生的变化虚拟内存空间的变化示例--验证fork函数创建进程时的操作 对文件IO…

【例题】lanqiao3226 宝藏排序Ⅱ

样例输入 5 1 5 9 3 7样例输出 1 3 5 7 9解题思路 这里的n≤10^5&#xff0c;说明O(n ^2)的算法行不通。 基于比较的高效算法和基于数值划分的高效算法全部参考这篇文章 代码 最简单的自带排序 nint(input()) alist(map(int,input().split()))a.sort() print( .join(map…

量化交易backtrader实践(二)_基础加强篇(1)_数据列表准备与主要实践内容

上一篇回顾 上一篇是数据获取篇&#xff0c;在上一篇里&#xff0c;我们初步接触了backtrader的回测逻辑&#xff0c;重点放在了回测的数据获取的问题上&#xff0c;确保了我们在用合适且有效的正规数据在做回测&#xff0c;我们的目的是要通过backtrader深入讨论量化交易的内…

【Linux进程控制】进程等待

目录 进程等待 进程等待是什么&#xff1f; 为什么&#xff1f; 怎么办&#xff1f; wait方法 获取子进程status 多进程的等待问题 waitpid方法 什么是阻塞等待&#xff1f;什么是非阻塞等待&#xff1f; wait/waitpid获取子进程信息原理 进程等待 进程等待是什么&am…

【AI学习】陶哲轩在 2024 年第 65 届国际数学奥林匹克(IMO)的演讲:AI 与数学

陶哲轩在 2024 年第 65 届国际数学奥林匹克关于AI 和数学的演讲&#xff0c;很有意思。陶哲轩的讲话语速太快了&#xff0c;足见其聪明&#xff01; AI用于数学的一些方面&#xff1a; 陶哲轩介绍到刚刚被数学家接受并开始普及的方法&#xff1a;形式化证明辅助工具。 形式化…

API:连接数字世界的隐形纽带

在这个智能手机和应用程序无处不在的时代&#xff0c;你可能听说过API这个术语&#xff0c;但你知道它究竟是什么吗&#xff1f;API&#xff0c;全称为应用程序编程接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一种让不同的软件和服务之间能够…

MySQL基础篇(黑马程序员2022-01-18)

1 MySQL数据库概述 1.1 MySQL数据库的下载,安装,启动停止 1.2 数据模型 (1)关系型数据库(RDBMS) 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; A. 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护。…

C++11第五弹:线程库 | 互斥锁 | 原子操作

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

蓝牙耳机是入耳式的好还是开放式的好?2024开放式耳机推荐

个人推荐入开放式耳机&#xff0c;戴起来更舒服&#xff0c;主要有以下几方面原因&#xff1a; 减少对耳部的压迫&#xff1a; 不入耳设计&#xff1a;开放式耳机通常不需要插入耳道&#xff0c;避免了对耳道的直接压迫。入耳式耳机的耳塞长时间塞在耳道内&#xff0c;会对耳…

Linux基础---07文件传输

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…

前端基础知识(HTML+CSS+JavaScript)

文章目录 一、HTML1.1 HTML 基础&#xff1a;1.1.1 HTML 的概念&#xff1a;1.1.2 认识 HTML 标签&#xff1a;1.1.3 HTML 文件基本结构&#xff1a;1.1.4 标签层次结构&#xff1a; 1.2 HTML 快速入门&#xff1a;1.3 HTML常见标签&#xff1a;1.3.1 标题标签&#xff1a;h1-h…

数据结构-2.顺序表

1.线性表 线性是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表有: 顺序表 , 链表 , 栈 , 队列... 线性表在逻辑上是线性结构, 也就是连续的一条直线 . 但是在物理结构上并不是连续的, 线性表在物理上存储时, 通常以数组和链式结…

5-----RYZ维修工具 操作界面预览与功能操作解析 刷机 解锁 修复参数等等

以上是工具选项功能的界面预览 。通过预览可以看到很多功能选项。此类工具涵盖了很多操作区域。需要根据自己机型的实际需求来操作。根据开发者的描述。此工具有一下功能。包含mtk刷机 分区修复。9008刷机 备份基带efs等等。 高通操作区域 高通修复串码 高通修改写入基带qc…

石化盈科PMO总经理任志婷受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 石化盈科信息技术有限责任公司运营管理部总经理兼PMO总经理任志婷女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“激活关键的少数派——项目经理培养体系的设计实践”。大会…

无人机视角下落水救援检测数据集

无人机视角下落水救援检测数据集&#xff0c;利用无人机快速搜索落水者对增加受害者的生存机会至关重要&#xff0c;该数据集共收集12万帧视频图像&#xff0c;涵盖无人机高度从10m-60m高度&#xff0c;检测包括落水者&#xff08;11万标注量&#xff09;、流木&#xff08;900…