C++ 函数的默认形参和函数重载

C++ 函数的默认形参和函数重载

函数的默认形参

在C++中,函数的默认形参(Default Arguments)允许在函数声明或定义时为一个或多个参数指定默认值。这意味着在调用函数时,如果某个参数没有提供值,则自动使用其默认值。这个特性可以使函数调用更加灵活,减少需要写的重载函数数量,同时保持代码的清晰和简洁。

使用默认形参的规则和语法

  1. 指定默认值:在函数声明或定义中,通过在参数名后面使用=操作符和默认值来指定默认形参。

    void displayMessage(const std::string& msg = "Hello, World!") {std::cout << msg << std::endl;
    }
    
  2. 默认参数从右向左:如果函数有多个参数,具有默认值的参数必须位于没有默认值的参数的右侧。换句话说,一旦某个参数被赋予默认值,其右侧的所有参数也必须有默认值。

    void setDetails(const std::string& name, int age = 30, bool isStudent = false);
    
  3. 调用时省略带默认值的参数:在调用具有默认形参的函数时,可以省略一个或多个带有默认值的参数。

    displayMessage(); // 输出 "Hello, World!"
    displayMessage("Hi there!"); // 输出 "Hi there!"
    
  4. 声明与定义:函数的默认参数可以在函数声明时给出,也可以在函数定义时指定,但不应同时在声明和定义中为同一参数指定默认值。通常,在函数声明中指定默认值是较好的做法,这样函数的用户可以通过头文件看到默认参数值。

    // 声明
    void logEvent(const std::string& event, int severity = 1);// 定义
    void logEvent(const std::string& event, int severity) {// 函数体...
    }
    

默认形参的好处

  • 减少重载:默认形参可以减少函数重载的需要,因为可以用单个函数处理多种不同的调用情况。
  • 提高灵活性:使得函数调用更加灵活,调用者可以只提供他们关心的参数,其余参数使用函数定义的默认值。
  • 代码简洁:有助于保持接口简洁,减少因为处理各种调用情况而导致的代码膨胀。

注意事项

  • 与函数重载的交互:使用默认形参时需要注意其与函数重载的交互,确保不会引起调用的歧义。
  • 默认参数的选择:为函数参数选择合理的默认值,以确保函数的逻辑正确且易于理解。
  • 复杂默认参数:尽管C++允许使用复杂的表达式作为默认参数,但为了保持代码的可读性,应尽可能使用简单直观的默认值。

总之,C++中的默认形参是一个强大的特性,能够使函数调用更加灵活和方便,但在使用时应注意避免引入调用歧义或降低代码的可读性。

代码示例

#include <iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都需要加std前缀// 定义一个print函数,它接受一个字符和一个整数n。整数n有一个默认值1。
void print(char ch, int n = 1) {// 使用一个for循环,循环n次for (int i = 0; i < n; i++)cout << ch; // 在每次循环中打印字符ch
}int main() {print('*'); // 调用print函数,只传入一个字符参数,使用n的默认值1,打印一个'*'字符cout << endl; // 打印换行符,以便下一行输出在新的一行开始print('*',3); // 调用print函数,传入字符'*'和整数3,打印三个'*'字符cout << endl; // 打印换行符print('*',5); // 调用print函数,传入字符'*'和整数5,打印五个'*'字符cout << endl; // 打印换行符,结束程序的输出
}

函数重载

在C++中,函数重载是一种多态性的形式,允许在同一作用域内有多个同名函数,只要它们的参数列表不同。这意味着你可以有多个同名的函数,但它们接受不同数量或类型的参数。编译器根据函数被调用时提供的参数的数量和类型来确定应该使用哪个函数版本。这样可以提高代码的可读性和可用性,因为你可以给执行相似功能的函数赋予相同的名字,而通过它们的参数列表来区分它们。

函数重载的规则

要实现函数重载,必须遵守以下规则:

  1. 参数列表必须不同:这可以是参数的数量不同,参数的类型不同,或者参数的顺序不同(如果类型也不同)。
  2. 返回类型不是区分重载函数的依据:仅仅返回类型不同不足以区分重载的函数。
  3. 函数重载解析是在编译时进行的:编译器根据调用函数时提供的参数类型和数量,在编译时决定使用哪个函数版本。

例子

下面是一个简单的C++代码示例,展示了函数重载的使用:

#include <iostream>
using namespace std;// 第一个版本接受两个int类型的参数
void display(int a, int b) {cout << "Sum of integers: " << a + b << endl;
}// 重载版本接受两个double类型的参数
void display(double a, double b) {cout << "Sum of doubles: " << a + b << endl;
}// 另一个重载版本接受三个int类型的参数
void display(int a, int b, int c) {cout << "Sum of three integers: " << a + b + c << endl;
}int main() {display(5, 10);       // 调用第一个版本display(3.14, 2.72);  // 调用第二个版本display(5, 10, 15);   // 调用第三个版本return 0;
}

在这个例子中,display函数被重载了三次:第一次是两个整数参数的版本,第二次是两个双精度浮点数参数的版本,第三次是三个整数参数的版本。编译器根据函数调用时提供的参数的数量和类型来决定使用哪个版本。

使用注意事项

虽然函数重载是一个强大的特性,但使用时也需要注意避免一些常见的问题,例如:

  • 确保重载函数的逻辑是一致的:所有同名函数应该执行相似的操作,以避免混淆。
  • 避免过度重载:过多的重载可能会使代码难以理解和维护。
  • 注意默认参数和重载的交互:默认参数与函数重载结合使用时可能会导致歧义。

通过遵循这些准则,你可以有效地使用函数重载来提高代码的清晰度和灵活性。

代码示例

#include <iostream> // 包含标准输入输出流库
using namespace std; // 使用标准命名空间,避免每次调用标准库函数时都需要加std前缀// 定义一个名为add的函数,接受两个整型参数。第二个参数y有一个默认值2。
int add(int x, int y = 2) {return x + y; // 返回两个整型参数的和
}// 重载add函数,这次函数接受两个双精度浮点型参数。第二个参数y同样有一个默认值2.0。
double add(double x, double y = 2.0) {return x + y; // 返回两个双精度浮点型参数的和
}int main() {cout << add(5, 3) << endl; // 调用第一个重载版本(整型参数),传入5和3,打印结果8cout << add(5.3, 7.8) << endl; // 调用第二个重载版本(双精度浮点型参数),传入5.3和7.8,打印结果13.1// 使用cout打印调用add函数的结果。传入的第一个参数是整数5,通过(double)进行显式类型转换成双精度浮点数,// 第二个参数是原生的双精度浮点数7.8。这样的参数类型组合将匹配到接受双精度浮点数参数的add函数重载版本。cout << add((double)5, 7.8) << endl;}

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

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

相关文章

字节跳动后端工程师实习生笔试题-c++

字节跳动后端工程师实习生笔试题链接 笔试题 1. 最大映射2. 木棒拼图3. 魔法权值4. 或与加 1. 最大映射 有 n 个字符串&#xff0c;每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字&#xff0c;不同字符映射为不同的数字。这样每个字符串就可以看…

金航标和萨科微总经理宋仕强说,中国还有一个优势就是有全世界最大的半导体消费市场

金航标和萨科微总经理宋仕强说&#xff0c;中国还有一个优势就是有全世界最大的半导体消费市场&#xff0c;有超过1万亿人民币的规模&#xff0c;全球占比34%&#xff0c;领先美国&#xff08;27%&#xff09;&#xff0c;更大幅领先欧洲和日韩&#xff0c;金航标电子是在的中国…

Vue3 watch侦听器

一 侦听响应式ref 侦听响应式ref常量&#xff0c;当常量的ref的value值发生改变时会触发watch 一个小栗子&#xff1a;当输入框的输入内容变化时下方的文本也会跟着改变 <template><div class"box content"><div class"intro"><el…

【C语言】字符分类函数与字符转换函数

1. 字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff1a; int islower ( int c ); islow…

Linux 15个常用脚本练习(初级)

&#xff08;1&#xff09;用户猜数字 #!/bin/bash # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了, # 猜小了或猜大了,直至用户猜对脚本结束。 # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数 # 使用取余算法将随机数变为 1‐100 的…

js中函数参数的归一化处理

在 JavaScript 中&#xff0c;函数参数的归一化处理是一种将不同类型或格式的参数转换为统一的标准或格式的过程。这样做的目的是为了提高代码的灵活性、可维护性和可重用性。 以下是一些常见的函数参数归一化处理的方式&#xff1a; 数据类型转换&#xff1a;将不同类型的参数…

软考高级,高项和架构哪个更容易?

软考高级共有5个科目&#xff0c;考试难度都是偏大的。相对而言&#xff0c;信息系统项目管理师的考试难度小于系统架构设计师&#xff0c;不过目前高项是1年1考&#xff0c;架构是1年2考&#xff0c;从这个层面来说&#xff0c;通过架构考试的机会要多一些。 架构&高项考…

RabbitMq——direct交换器和fanout交换器 扇形交换器

direct交换器&#xff1a; Configuration 发送 Bean protected Queue queue&#xff08;&#xff09;{ Queue queue new Queue&#xff08;“myQueue”&#xff09; return queue&#xff1b; } amqpTemplate.convertAndSend("myQueue","这是发送的内…

pytorch_fid计算fid

pip install pytorch-fid from pytorch_fid import fid_score# 准备真实数据分布和生成模型的图像数据 real_images_folder xxx generated_images_folder xxx# 计算FID距离值 fid_value fid_score.calculate_fid_given_paths([real_images_folder, generated_images_folder]…

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…

mmap访问内存方式

mmap访问内存方式 请看下面的Java代码&#xff0c;这段程序是取自1brc竞赛的第一名的代码。 public static void main(String[] args) throws IOException, InterruptedException {... ...try (var fileChannel FileChannel.open(java.nio.file.Path.of(FILE), java.nio.fil…

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启&#xff0c;重启es即可 ./bin/elasticsearch-pl…

配置LVS NAT模式

配置LVS NAT模式 环境准备 client1&#xff1a;eth0->192.168.88.10&#xff0c;网关192.168.88.5lvs1: eth0 -> 192.168.88.5&#xff1b;eth1->192.168.99.5web1&#xff1a;eth1->192.168.99.100&#xff1b;网关192.168.99.5web2&#xff1a;eth1->192.168…

基于C语言的“贪吃蛇”游戏设计理念

3.功能描述&#xff1a;本游戏主要实现以下几种功能 图1.游戏功能模块 3.1. 贪吃蛇的控制功能&#xff1a;通过各种条件的判断&#xff0c;实现对游戏蛇的左移、右移、下移、上移、自由移动&#xff0c;贪吃蛇的加长功能。 3.2. 游戏显示更新功能&#xff1a;当贪吃蛇左右移动、…

容器只适用于微服务吗?

容器是一种技术&#xff0c;它将应用及其依赖项打包成一个可移植的单元&#xff0c;以便在不同的计算环境中一致地运行。这种技术确实在微服务架构中得到了广泛应用&#xff0c;因为容器可以帮助实现微服务的快速部署、水平扩展和管理。 然而&#xff0c;容器并不仅限于用于微…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常&#xff0c;exec() 调用与 fork() 调用一起使用&#xff…

Leetcode 3080. Mark Elements on Array by Performing Queries

Leetcode 3080. Mark Elements on Array by Performing Queries 1. 解题思路2. 代码实现 题目链接&#xff1a;3080. Mark Elements on Array by Performing Queries 1. 解题思路 这一题我们只需要按照题意进行一下实现就行了。具体来说的话&#xff0c;我们只需要依序遍历一…

算法笔记p154最大公约数和最小公倍数

目录 最大公约数辗转相除法证明例子代码实现 最小公倍数代码实现 最大公约数 正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数&#xff0c;一般用gcd(a, b)表示a和b的最大公约数。 辗转相除法 设a、b均为正整数&#xff0c;则gcd(a, b) gcd(b, a % b)。即被…

【C语言_字符函数和字符串函数_复习篇】

目录 一、字符函数 1.1 字符分类函数 1.2 字符转换函数 二、字符串函数 2.1 strlen函数 2.1.1 strlen函数的使用 2.1.2 strlen函数的模拟实现 2.2 strcpy函数 2.2.1 strcpy函数的使用 2.2.2 strcpy函数的模拟实现 2.3 strcat函数 2.3.1 strcat函数的使用 2.3.2 strcat函数的…

hololens2发布unity设置

生成vs工程再向hololens发布时&#xff0c; Architecture选X64或ARM64都可以成功发布