【C++ | 函数】默认参数、哑元参数、函数重载、内联函数

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-05-04 15:18:51

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、默认参数
    • ✨2.1 默认参数
    • 🌰2.2 举例子
  • 🎄三、哑元参数
  • 🎄四、函数重载
    • ✨4.1 函数重载
    • 🌰4.2 举例子
  • 🎄五、内联函数
  • 🎄六、总结


在这里插入图片描述

🎄一、概述

C++的函数在C语言的函数基础上增加了一些新的特性,如:函数重载、默认参数、哑元参数、内联函数。

本文主要介绍C++在函数增加的一些新的特性,并举例子来对这些特性加深理解。

在这里插入图片描述

🎄二、默认参数

这个小节介绍C++相对于C语言新增的一项内容:默认参数。

✨2.1 默认参数

默认参数指的是当函数调用中省略了实参时自动使用的一个值。

其具体做法是,在函数声明时给函数参数指定一个默认值,如果调用函数时没有给这个参数传入实参,则使用默认值,如果传入了实参,则替换掉默认值。

参数的默认值要保持靠右原则,如果一个参数有默认值,则参数右边所有的参数都必须有默认值。

当函数的声明和实现分开时,则需要在声明时指定默认值,实现不能再指定。


🌰2.2 举例子

下面看看例子加深理解

// 06_default_param.cpp 
// g++ 06_default_param.cpp
#include <iostream>using namespace std;void print_int(int i=-1)
{cout << "i=" << i << endl;
}// 当函数的声明和实现分开时,则需要在声明时指定默认值,实现不能再指定。
void print_double(double d=1.1);
void print_double(double d/*=1.0*/)
{cout << "d=" << d << endl;
}int main()
{print_int();	// 不给实参,打印默认值 -1print_int(10);	// 传入实参,打印 10print_double();print_double(2.1);return 0;
}

运行结果:
在这里插入图片描述


在这里插入图片描述

🎄三、哑元参数

如果一个函数的参数,只有类型,没有参数名,则这个参数叫哑元。

哑元的作用:

  • 让无参的函数,参数匹配更加严格
    void fun_a();
    void fun_b(void); // 明确指出该函数没有参数
    
  • 保持函数向前兼容。某个函数以前是某个参数的,现在不使用该参数了,可以只保留类型。
    void fun_decode(int key); // 以前的函数
    void fun_decode(int); // 现在的函数,保留类型,避免旧的调用出错
    
  • 区分函数
    operator++(){/* 这是默认的前加加 */ 
    }
    operator++(int){/* 这是默认的后加加 */ 
    }
    

在这里插入图片描述

🎄四、函数重载

✨4.1 函数重载

函数重载,有些书籍也把它叫做函数多态,是指“同样函数名的多个函数,可以具有不同的参数列表和功能”的一种现象。

函数重载有点像多义词,例如:“吃狗粮”,有时指狗吃狗粮,有时指人吃狗粮。

重点:函数重载的关键是函数的参数列表,也称为函数特征标(function signature)。如果两个函数的参数数目、参数类型、参数的排列顺序都相同, 则它们的特征标相同,而变量名、函数返回值类型是无关紧要的。 C++允许定义名称相同的函数,条件是它们的特征标不同。可以参考下面例子理解:

// 1.函数参数个数不同,所以函数特征不一致。
int fun_a(int a);
int fun_a(int a, int b);// 2.函数参数类型不同,所以函数特征不一致。
int fun_a(int a);
int fun_a(char a);// 3.函数参数排列顺序不同,所以函数特征不一致。
int fun_a(int a, char c);
int fun_a(char a, int c);// 4.函数参数的数目、类型、参数排列顺序都相同,所以函数特一致。与参数名、返回值类型无关
int fun_a(int a, char c, short s);
int fun_a(int i, char j, short k);
void fun_a(int i, char j, short k);

重载函数匹配的步骤:

  • 1、选择候选函数(candidate function):候选函数的2个特征,一是要求与被调用函数同名;二是其声明在调用的地方可见。
  • 2、选择可行函数(viable function):可行函数的两个特征,一是形参与调用函数时提供的实参数量相等;二是实参与形参的类型相同,或是能转换成形参的类型。
  • 3、从可行函数中选择与本次调用最匹配的函数,实参与形参的类型🈷接近越匹配。

何时使用函数重载:仅当函数基本上执行相同的任务, 但使用不同形式的数据时,才应采用函数重载。


🌰4.2 举例子

// 06_overload.cpp 
// g++ 06_overload.cpp
#include <iostream>using namespace std;void print_fun(int i, double d)
{cout << "print_fun_i_d" << endl;
}void print_fun(double d, int i)
{cout << "print_fun_d_i" << endl;
}int main()
{int i = 1;double d = 1.2;print_fun(i, d);print_fun(d, i);//print_fun(i, 3.0f);//print_fun(d, 3);return 0;
}

在这里插入图片描述

🎄五、内联函数

内联函数是 C++为提高程序运行速度所做的一项改进。

内联函数比普通函数多一个inline修饰,编译器会在编译期间 将内联函数的函数代码替换掉函数调用。这样操作使得程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。

inline int getmax(int x,int y){return x>y?x:y;
}
cout << getmax(x,y) << endl; // 在编译过程被替换为 cout << (x>y?x:y) << endl;

注意:内联说明只是向编译器发出的一个请求, 编译器可以选择忽略这个请求。

一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。

🌰举例子:

// 06_inline.cpp 
// g++ 06_inline.cpp
#include <iostream>using namespace std;inline int getmax(int x,int y){return x>y?x:y;
}
#define GETMAX(X,Y) (((X)>(Y))?(X):(Y))
int main(){int x=123, y=100;cout << getmax(x,y) << endl; // 在编译过程被替换为 cout << (x>y?x:y) << endlcout << GETMAX(123,100) << endl; // 在预处理过程被替换return 0;
}

在这里插入图片描述

🎄六、总结

👉本文介绍C++相对于C语言新增的几个函数特性:默认参数、哑元参数、函数重载、内联函数,并举例子加深理解。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

腾讯云coding代码托管平台配置问题公钥拉取失败提示 Permission denied(publickey)

前言 最近在学校有个课设多人开发一个游戏&#xff0c;要团队协作&#xff0c;选用了腾讯云的coding作为代码管理仓库&#xff0c;但在配置的时候遇到了一些问题&#xff0c;相比于github&#xff0c;发现腾讯的coding更难用&#xff0c;&#xff0c;&#xff0c;这里记录一下…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

数据库开启远程连接

服务器端添加一个允许远程连接的root用户: mysql -u root -p create user root192.168.10.20 identified by admin; //创建一个192.168.10.20地址远程连接的root用户 grant all privileges on *.* to root192.168.10.20; //赋予远程root用户所有的权…

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的&#xff0c;有特殊作用的一些单词&#xff0c;不可以把这些单词作为标识符来使用。 注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来作为&#xff1a;类名、变量名、否则会报错。 标识符&#xff1a; 标识符就是…

基于Spring Cloud的房产销售平台设计与实现

基于Spring Cloud的房产销售平台设计与实现 开发语言&#xff1a;Java 框架&#xff1a;SpringCloud JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页界面&#xff0c;前台首页包括房源信息、…

【强训笔记】day18

NO.1 思路&#xff1a;双指针模拟。to_string将数字转化为字符。 代码实现&#xff1a; class Solution { public:string compressString(string param) {int left0,right0,nparam.size();string ret;while(right<n){while(right1<n&&param[right]param[right…

Ubuntu 安装 samba 实现文件共享

1. samba的安装: sudo apt-get install samba sudo apt-get install smbfs2. 创建共享目录 mkdir /home/share sudo chmod -R 777 /home/share3. 创建Samba配置文件: 3.1 保存现有的配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak3.2 打开现有的文件 sudo…

英语学习笔记8——What‘s your job?

What’s your job? 你是做什么工作的&#xff1f; 词汇 Vocabulary policeman 男警察 policewoman 女警察 police n. 警力 集合名词&#xff0c;永表复数 西方国家警察管的事很多。交警&#xff0c;刑警&#xff0c;武警一般不分开。 taxi driver 出租车司机 taxi / cab n.…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

【YOLO 系列】基于YOLO V8的金属表面缺陷检测检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

前言&#xff1a; 金属表面缺陷的及时检测对于保障产品质量和生产安全至关重要。然而&#xff0c;传统的人工检测方法往往效率低下、耗时长&#xff0c;并且容易受主观因素影响。为了解决这一问题&#xff0c;我们提出了基于深度学习技术的金属表面缺陷检测系统。 本项目采用…

[uniapp] 配置ts类型声明

我想引进图片,但是报错 声明一下就行 TypeScript 支持 | uni-app官网 创建tsconfig.json文件,复制官网的配置 然后在随便一个目录下写一个随便名字的.d.ts文件 例如这样 保存就行 因为ts是默认扫描全部的,所以要按照官网的写法 把不必要的排除掉就行,免得浪费性能

Linux vscode push报错fatal: Authentication failed

注意啊&#xff0c;Git基于密码的身份验证已经被删除了&#xff0c;所以这个报错发生时无论密码正确与否&#xff0c;以及参考比较旧的改bug教程&#xff0c;都没法提交。进入提示的网址&#xff0c;生成个人访问令牌就好了