【是C++,不是C艹】 省缺参数 | 函数重载 | 内联函数

news2024/11/13 10:21:56

💞💞欢迎来到 Claffic 的博客 💞💞

  👉 专栏:《是C++,不是C艹》👈

前言: 

上期,我带大家给C++打了招呼,捎带着认识了命名空间和输入输出,那么这期带大家继续学习C++,让我们开始吧!

注:

你最好是学完了C语言,并学过一些初阶的数据结构。


(没有目录) ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

Part1:省缺参数

1.一个引子

我把这段代码抛给你:

#include<iostream>
using namespace std;
void Func(int a)
{
	cout << a << endl;
}
int main()
{
	Func(3);
	return 0;
}

 挺平平无奇的,是吧?

👁️‍🗨️输出结果:3

那如果我手贱,调用时没传参数呢?

#include<iostream>
using namespace std;
void Func(int a)
{
	cout << a << endl;
}
int main()
{
	Func(); // 这里没传参数
	return 0;
}

活生生的报错: 

报错原因:没有传递参数 

但是,但是,

C++可以这样玩:

#include<iostream>
using namespace std;
void Func(int a = 114514) // 这里变了哈
{
	cout << a << endl;
}
int main()
{
	Func(); // 同样没有传参
	return 0;
}

 👁️‍🗨️输出结果:114514

这就是“省缺参数”,接下来就让我带你学它!!! 

2.概念

准确地说,什么是省缺参数呢?

缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值
在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

简单说:你传了就用你的,不传也没关系,我用自己的。 

在引入当中的例子就可以很好地解读省缺参数的基本概念:

#include<iostream>
using namespace std;
void Func(int a = 114514) // 指定省缺值
{
	cout << a << endl;
}
int main()
{
	Func(3); // 指定实参,使用实参
	Func();  // 不指定实参,使用省缺值
	return 0;
}

👁️‍🗨️输出结果:3

                       114514 

3.分类

省缺参数分两类:全省缺参数半省缺参数

• 全省缺参数:函数的参数指定了省缺值;

• 半省缺参数:函数的参数部分指定了省缺值。

接下来分别讲解:

全省缺参数:

🚨注意:一定是全部的参数都要给省缺值

代码演示: 

#include<iostream>
using namespace std;
void Func(int a = 1,int b = 2,int c = 3 ) // 都给了哈
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;

}
int main()
{
	Func();           // 不传参
	Func(10);         // 传第一个参
	Func(10, 20);     // 传第一,第二个参
	Func(10, 20, 30); // 全传参,不采用省缺值

	return 0;
}

👁️‍🗨️输出结果:

🪄解释:

第一次调用:没有传参,都使用省缺参数;

第二次调用:传递了10,这个给了a,其余默认;

第三次调用:传递了10,20,依次给了a,b,c默认;

第四次调用:全传递,不采用省缺值。

好奇心大发,我值传给c行不行?

Func(, , 30);     // 试图传给c

🈲看这爆红你就知道行不行了。

为甚?

参数默认是从左往右传递的啊,语法就这样规定的,不行你就给本贾尼打个电话👻

半省缺参数:

半省缺参数可不能理解成一半... ...

它指的是部分省缺。

🌰例子:

void Func(int a, int b = 2, int c = 3) // 给b和c默认值
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;
}
void Func(int a, int b, int c = 3) // 给c默认值
{
	cout << a << ' ';
	cout << b << ' ';
	cout << c << endl;
}

“我故意保留了一部分省缺,这样才能让你知道这是半省缺!!!”😝

那我这样给省缺行不行?

🈲你说行不行?爆红是爆给谁看的?

🚨记住:

半缺省参数必须 从右往左依次 来给出,不能间隔着给。

4.注意

这里就总结一下在使用省缺参数中要注意的点: 

• 半缺省参数必须 从右往左依次 来给出,不能间隔着给;
• 缺省参数不能函数声明和定义同时出现;
• 缺省值必须是常量或者全局变量
C语言不支持(编译器不支持)。

Part2:函数重载

1.一个引子

从自然语言开始吧,比如中文:

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
🌰比如:
以前有一个笑话,中国有两个体育项目大家根本不用看,也不用担心。
一个是乒乓球,一个是男足。
前者是“ 谁也赢不了! ,后者是 谁也赢不了!

🪄嘿,谁也赢不了!”这句话,我不用解释你也知道它的双重意思,“谁也赢不了!”这句话就被重载了。

2.概念

自然语言有重载,像C++这样的计算机语言中也有函数重载:

C++ 允许在 同一作用域中 声明几个功能类似 的同名函数。 
只要满足下列一个条件就能满足函数重载:
①参数类型不同
②参数个数不同
③参数顺序不同

🌰例子:

#include<iostream>
using namespace std;
// ① 参数类型不同
int Add(int x, int y)
{
	cout << "int Add(int x, int y)" << endl;
	return x + y;
}

double Add(double x, double y)
{
	cout << "double Add(double x, double y)" << endl;
	return x + y;
}

int main()
{
	cout << Add(3, 5) << endl;
	cout << Add(3.1, 5.2) << endl;

	return 0;
}

👁️‍🗨️输出结果:

(这种类型适用了不同数据类型的加法)

// ② 参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
int main()
{
	f();
	f(10);

	return 0;
}

👁️‍🗨️输出结果:

// ③ 参数类型顺序不同
void f(int a, char b)
{
 cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
 cout << "f(char b, int a)" << endl;
}
int main()
{
	f(10, 'c');
	f('c', 10);

	return 0;
}

 👁️‍🗨️输出结果:

3.不支持函数重载

以下情况不支持函数重载:
①函数返回值不同
②函数省缺值不同
③调用存在歧义

函数返回值不同: 

#include <iostream>
using namespace std;

int func(int x) {
	;
}
double func(int x) {
	;
}
int main()
{
	func(3);  // 不知道这里是调用 int func 还是 double func

	return 0;
}

👁️‍🗨️结果:

这个还好理解,在调用的时候区别不开返回类型

函数省缺值不同: 

#include <iostream>
using namespace std;

void func(int a) 
{
	cout << "func(int a)" << endl;
}
void func(int a = 10) 
{
	cout << "func(int a)" << endl;
}
int main()
{
	func(1);

	return 0;
}

👁️‍🗨️结果:

调用存在歧义:

#include <iostream>
using namespace std;

void func() 
{
    cout << "func()" << endl;
}
void func(int a = 0) 
{
    cout << "func(int a)" << endl;
}
int main()
{
    func();   // 调用存在歧义
    func(1);  // 可以正常调用

    return 0;
}

👁️‍🗨️结果: 

 

Part3:内联函数

1.概念

内联内联,单看这个名字的却没什么概念,这里就直接告诉你吧:

inline 修饰 的函数叫做内联函数, 编译时 C++ 编译器会在 调用内联函数的地方展开
没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

众所周知,普通的函数调用都是需要建立栈帧的,

存在这种情况:需要频繁调用的函数,并且函数本身代码量不多,那么就可以利用内联函数,加个 inline,展开后就没有函数调用建立栈帧的开销了。

🌰例子:

#include <iostream>
using namespace std;

inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(3, 5);
	return 0;
}

 转到反汇编,就不会看到call指令了

2.特性

我们来客观的分析一下内联函数的特性:

inline 是一种 以空间换时间 的做法,如果编译器将函数当成内联函数处理,在 编译阶段,会用函数体替 换函数调用;
缺陷:可能会使目标文件变大
优势:少了调用开销,提高程序运行效率
inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同;
一般建议:将 函数规 模较小 不是递归、频繁调用 的函数采用inline 修饰

🪄程序员不小心,还有编译器挡着嘛,如果你把太长的函数内联了,编译器受不了的~

它大概率会忽略内联请求。

inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址了,链接就会找不到。


总结: 

本期继续带大家学习C++,知识点有:省缺参数 | 函数重载 | 内联函数,主要是针对函数的。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗

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

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

相关文章

LeetCode——链表简单题题解

83. 删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 解题思路&#xff1a;用一个指向节点类型的指针保…

Vscode配置C/C++开发环境

下载Vscode进行安装。 下载MinGW-W64 GCC最新版本&#xff0c; 选择x86_64-win32-seh进行下载。解压放入自定义目录&#xff08;英文路径&#xff09;后&#xff0c;添加$:\mingw64\bin到系统Path环境变量。安装C/C插件。 在.c后缀文件中按Ctr Shift P&#xff0c;选择C/C …

Windows系统文件被faust勒索病毒加密勒索病毒解密恢复,电脑中病毒了怎么修复?

恶意软件的攻击已经让电脑用户变得更加谨慎了。在最近的一波攻击中&#xff0c;faust勒索病毒已经对使用Windows系统的计算机造成了广泛的破坏。该病毒利用加密技术锁定用户的文件&#xff0c;只有在支付一定数额的赎金后才会解锁这些文件。如果你的计算机中也受到了这种勒索病…

MaxScript编写bone转换biped工具

一、制作转换工具的缘由 大家好&#xff0c;我是阿赵。我经常从各种渠道得到了一些角色模型&#xff0c;这些模型得到之后&#xff0c;会发现是带有蒙皮和骨骼&#xff0c;甚至带有动作的。   不过这些资源很多都是从游戏截取出来的&#xff0c;导入到3DsMax之后&#xff0c;…

信息安全复习十:Web与电子商务安全

一、章节梗概 1.信息安全的学科内容 2.Web和电子商务安全问题提出 3.安全套接字协议SSL与传输层安全协议TLS 4.安全电子交易(SET)简要介绍 复习&#xff1a; 密码学内容&#xff1a;对称密钥密码、公开密钥密码、报文鉴别 PKI&#xff1a;数字签名、数字证书、信任关系 身份认…

MES管理系统助力企业数字化与实体经济实现“数实融合“

中国企业评估协会日前公布了2022年度“中国新经济500强”的名单。在这些企业中&#xff0c;先进制造业企业的比例超过了半数&#xff0c;尤其是互联网与现代信息技术服务业、新能源产业、新型生活性服务业等&#xff0c;在这些行业中占据了重要地位。由此可以看出&#xff0c;绿…

C/C++每日一练(20230427) 二叉树专场(5)

目录 1. 从中序与后序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 2. 从先序与中序遍历序列构造二叉树 &#x1f31f;&#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每…

微信小程序php+python+nodejs+vue 高校工资管理系统

在线公益知识练习及测试系统是随着计算机技术和互联网技术的发展而产生的一种的新的练习及测试模式&#xff0c;与传统的纸质化练习及测试不同&#xff0c;在线系统提高了练习或测试的效率&#xff0c;减少了纸张的浪费&#xff0c;减轻了教师的评卷压力&#xff0c;同时也为参…

易观千帆 | 金融机构如何保证用户体验长期可持续?

易观&#xff1a;用户体验正逐渐成为金融机构的命脉。 数字经济时代的到来&#xff0c;金融机构面临着来自内部和外部的双重压力。一方面&#xff0c;互联网金融企业凭借强大的技术能力以及人才优势&#xff0c;通过互联网运营的模式迅速响应客户需求&#xff0c;吸引了大量用户…

自定义Feign日志

文章目录 开篇定位Feign是怎么打印日志的&#xff1f;自定义FeignLogger实现 开篇 在上一篇Feign打印日志文章中&#xff0c;已经成功打印了FeignClient请求服务的日志信息&#xff0c;但是默认打印的日志太过零散&#xff0c;不是我们想要的。怎么能自定义日志打印的格式和内…

系统分析师《企业信息化战略与实施》高频知识点二

企业信息化战略与实施---系统建模 组织结构是一个企业内部部门的划分以及相互之间的关系&#xff0c;每个企业都有自己的组织结构图&#xff0c;它将企业分成若干部分&#xff0c;标明行政隶属关系。组织结构图是一种树结构&#xff0c;树的分支是根据上下级和行政隶属关系绘制…

二叉树 + 技巧

题目难度备注2471. 逐层排序二叉树所需的最少操作数目1635BFS 置换环 离散化2641. 二叉树的堂兄弟节点 II1677BFS 文章目录 周赛二叉树问题[2471. 逐层排序二叉树所需的最少操作数目](https://leetcode.cn/problems/minimum-number-of-operations-to-sort-a-binary-tree-by-l…

【AI绘画】云服务器部署stable-diffusion-webui保姆级教程

1.背景 之前给大家写过Mac苹果笔记本上部署stable-diffusion-webui的教程&#xff0c;知乎链接&#xff1a; 【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程 但是安装过程就花了一天的时间&#xff0c;各种问题处理起来真是苦不堪言。。。而且…

如何解决生产缺料问题?

对于一个生产型企业来说&#xff0c;生产缺料是管理中的疑难问题之一。 生产缺料导致的最直接的危害就有两个&#xff1a; 第一就是不能准时交货&#xff0c;降低企业信用&#xff0c;情况严重可能导致根据合同赔款&#xff0c;甚至丢失客户。 第二个危害就是增加了生产成本…

部署LVS-DR 集群及实验

一、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一种工作模式。 #①LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff1b; #②节点 Directo…

ueditor富文本编辑器上传木马图片或木马文件漏洞

漏洞分析&#xff1a; ueditor插件目录一般都自带index.html文件&#xff08;完整demo文件&#xff09;&#xff0c;这个文件原来是用来测试插件功能的&#xff0c;但粗心的程序员们&#xff0c;开发好项目后&#xff0c;都忘记删除这个demo文件了&#xff0c;导致黑客可以很轻…

微服务不是本地部署的最佳选择,不妨试试模块化单体

微服务仅适用于成熟产品 关于从头开始使用微服务&#xff0c;马丁・福勒&#xff08;Martin Fowler&#xff09;总结道&#xff1a; 1. 几乎所有成功的微服务都是从一个过于庞大而不得不拆分的单体应用开始的。 2. 几乎所有从头开始以微服务构建的系统&#xff0c;最后都会因…

win11安装双系统ubuntu20.04指导

目录 一、制作U盘启动盘二、硬盘分区2.1方法2.2分区过程 三、安装系统3.1进入U盘启动3.2安装ubuntu3.3设置启动项 四、更新软件五、遇到的问题5.1不能连接WIFI 电脑型号&#xff1a;联想拯救者Y7000P 2023 无线网卡型号&#xff1a;WIFI 6E AX211 160MHz 系统版本&#xff1a;w…

借助尾号限行 API 实现限行规则应用的设计思路分析

引言 尾号限行是指根据车牌号的末尾数字&#xff0c;规定某些时段内不能在特定区域行驶&#xff0c;这是城市交通管理的一种措施。尾号限行政策的实施可以缓解城市交通拥堵问题&#xff0c;减少环境污染和交通事故等问题。 尾号限行 API 是一种提供已知所有执行限行政策的城市…

iSulad+Kuasar:管理面资源消耗锐减 99%的新一代统一容器运行时解决方案

随着云计算和容器技术的不断发展&#xff0c;容器引擎和容器运行时已经成为了云原生时代的基石&#xff0c;它们负责了容器生命周期的管理以及容器运行过程中环境的创建和资源的配置。openEuler 社区基于容器引擎项目 iSulad[1]在解决容器运行效率、安全性以及隔离性等问题上进…