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

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

🦄个人主页:小米里的大麦-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 = 20return 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" 和 1printMessage("Hi"); // 使用 "Hi" 和 1printMessage("Hi", 3); // 使用 "Hi" 和 3return 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 = 20return 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" 和 18displayInfo("Alice", 25); // 使用 "Alice" 和 25return 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 = 30return 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: 7displayResult(op2, 3, 4);    // 输出 Result: 12return 0;
}

总结 

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

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

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

共勉

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot 图书管理系统
  • 鸿蒙开发笔记_电商严选02_登录页面跳转到我的页面、并传值
  • Matlab:科学计算与工程应用的强大利器
  • 【Linux】精通GDB:打造你的Linux调试超能力
  • cJSON-轻量级解析模块、字符串的神——编织STM32C8T6与阿里云信息传递的纽带
  • 引用和指针的区别(面试概念性题型)
  • cross-plateform 跨平台应用程序-09-phonegap/Apache Cordova 介绍
  • 使用nvm工具实现多个nodejs版本的维护和切换
  • 炫酷HTML蜘蛛侠登录页面
  • 裸金属服务器与云服务器的区别有哪些?
  • vue3路由基本使用
  • leetcode练习 子集II
  • uni-app实现web-view和App之间的相互通信
  • 思维训练900
  • windows系统安装docker
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Android系统模拟器绘制实现概述
  • Hibernate【inverse和cascade属性】知识要点
  • java2019面试题北京
  • js对象的深浅拷贝
  • js中forEach回调同异步问题
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0到1:PostCSS 插件开发最佳实践
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 第2章 网络文档
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 回顾2016
  • 如何合理的规划jvm性能调优
  • 使用权重正则化较少模型过拟合
  • 手写双向链表LinkedList的几个常用功能
  • 小程序01:wepy框架整合iview webapp UI
  • 在Mac OS X上安装 Ruby运行环境
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • k8s使用glusterfs实现动态持久化存储
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #laravel 通过手动安装依赖PHPExcel#
  • #LLM入门|Prompt#3.3_存储_Memory
  • (2015)JS ES6 必知的十个 特性
  • (55)MOS管专题--->(10)MOS管的封装
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (Java数据结构)ArrayList
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (七)Java对象在Hibernate持久化层的状态
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (原)Matlab的svmtrain和svmclassify
  • (转)Windows2003安全设置/维护
  • (转)四层和七层负载均衡的区别
  • (转)用.Net的File控件上传文件的解决方案
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)