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

news2024/12/27 13:05:20

💞💞欢迎来到 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/483291.html

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

相关文章

SPSS如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具栏 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对软件界面基础功能进行阐述。    1.菜单栏 &am…

如何向面试官正确地提问?

你好&#xff0c;我是朱显杰。今天我们来聊一聊面试时&#xff0c;如何向面试官正确提问。 我做过8年面试官&#xff0c;面试过500多人。在面试的过程中&#xff0c;我发现了一个普遍现象&#xff0c;就是大部分候选人都不知道如何向面试官正确提问。要么不问&#xff0c;白白…

RocketMq源码分析(六)--消息消费者启动流程

文章目录 一、消息消费者模式二、消费者启动流程1、 push模式1&#xff09;类关系2&#xff09;类构造器3&#xff09;启动流程 2、pull模式1&#xff09;类关系2&#xff09;类构造器3&#xff09;启动流程 一、消息消费者模式 消息消费分两种模式&#xff1a;推&#xff08;p…

【Redis】Redis缓存双写一致性之更新策略

介绍 面试题 1、只要用到缓存&#xff0c;就可能会涉及到Redis缓存与数据库双存储双写&#xff0c;只要是双写&#xff0c;就一定会有数据一致性问题&#xff0c;怎么解决一致性问题&#xff1f; 2、双写一致性&#xff0c;先动缓存redis还是数据库mysql&#xff1f;为什么&a…

剪枝与重参第十课:RepVGG重参

目录 RepVGG重参前言1. RepVGG2. RepVGG网络搭建2.1 conv_bn2.2 RepVGG Block初始化2.3 forward2.4 branch的合并2.5 重参的实现2.6 整体网络结构搭建2.7 模型导出 3. 完整示例代码总结 RepVGG重参 前言 手写AI推出的全新模型剪枝与重参课程。记录下个人学习笔记&#xff0c;仅…

了解npm run指令

了解npm run指令 在package.json文件中的script字段&#xff0c;可以定义脚本命令&#xff0c;通过npm run指令运行该脚本。 比如简单定义一个输出打印的shell脚本。 {"script": {"hw": "echo hello world!"} }执行npm run hw可以看到终端上打…

Python---正则表达式与递归

1. 正则表达式&#xff1a; 是一种字符串验证的规则&#xff0c;通过特殊的字符串组合来确立规则 用规则去匹配字符串是否满足 如(^[\w-](\.[\w-])*[\w-](\.[\w-])$)可以表示为一个标准邮箱的格式 re模块的三个主要方法&#xff1a; re.match&#xff1a; re.match(匹配规…

电子电气架构——车辆E/E架构Software独立性

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人只有在举棋不定,无从把握的时候才感到疲惫。只有去行动就能获得解放,哪怕做的不好也比无所作为强! 本文主要介绍车辆E/E架构常识,主要涉及E/E架构车载…

Java 操作ElasticSearch

Java REST提供了两种风格的客户端连接工具&#xff0c;Java High Level REST Client、Java Low Level REST Client&#xff0c;这里我就不去细说Java Low Level REST Client了&#xff0c;因为这我确实没用到过&#xff0c;也不是很了解&#xff0c;我说一下Java High Level RE…

LVS 负载均衡群集的 NAT 模式和 DR 模式

文章目录 一、NAT 模式和 DR 模式的介绍DR模式NAT模式两种模式的区别 二、DR模式集群构建配置 一、NAT 模式和 DR 模式的介绍 DR模式 当用户向负载均衡调度器&#xff08;Director Server&#xff09;发起请求&#xff0c;调度器将请求发往至内核空间PREROUTING链首先会接收到…

【JavaEE】HTML基础知识

目录 1.HTML结构 2.HTML常见标签 3.表格标签 4.列表标签 5.表单标签 ​6.select 标签 7.textarea 标签 8.无语义标签: div & span 9.标签小练习 1.HTML结构 形如&#xff1a; <body idmyId>hello</body> HTML的书写格式 标签名 (body) 放到 <…

【操作系统OS】学习笔记:第二章 进程与线程 (上)【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;…

58.网页设计规则#5_阴影

一些概念 ● 在一个100%平面设计的时代之后&#xff0c;我们现在又回到了在UI设计中使用阴影(“平面设计2.0”) ● 阴影箱深度(3D):阴影越多&#xff0c;离元素界面越远 利用好阴影 你不必使用阴影!只在对网站个性有意义的情况下使用它们 使用少量的阴影:不要给每个元素…

Jmeter接口自动化测试系列之Http接口自动化实战

以下主要介绍Jmeter接口自动化需要哪些控件、接口自动化实战及总结。 前面的系列文章&#xff0c;介绍了常用组件、参数化、接口依赖、断言等知识点&#xff0c;今天我们要将这些结合起来&#xff0c;进行综合实战。 2023年B站最新Jmeter接口测试实战教程&#xff0c;精通接口…

从一到无穷大 #5 公有云时序数据库定价

文章目录 引言serverless实例售卖结论 Azure CosmosDB预配吞吐量自动缩放吞吐量Serverless预留容量存储量 Amazon Timestream写入计费查询计费存储 阿里云TSDB阿里云Lindom时序引擎实例固定费用存储费用节点费用 华为云GaussDB(for Influx)腾讯云CTSDBTDengineInfluxDB CloudAW…

c++11下篇 + 智能指针

c11下篇 智能指针 1 可变参数模板1.1 递归函数方式展开参数包1.2 逗号表达式展开参数包1.3 STL容器中的empalce相关接口函数&#xff1a; 2 lambda达式2.1 c的痛2.2 lambda表达式语法2.3 函数对象与lambda表达式 3 包装器3.1 bind 4 线程库4.1 thread类的简单介绍4.2 面试题&a…

MySQL示例数据库(MySQL Sample Databases) 之 world_x数据库

文章目录 MySQL示例数据库(MySQL Sample Databases) 之 world_x数据库官方示例数据介绍world_x数据库world_x数据库安装world-db/world.sql的脚本内容参考 MySQL示例数据库(MySQL Sample Databases) 之 world_x数据库 官方示例数据介绍 MySQL 官方提供了多个示例数据库&#…

差分数组 技巧小记

差分数组 差分数组二维差分 差分数组 如果两个信息“长得很像”&#xff0c;只要保留一个&#xff0c;对另一个&#xff0c;只要保留它们的差异&#xff0c;然后进行微调就行了。 差分数组&#xff1a; 3210&#xff0c;3208&#xff0c;3206&#xff0c;3211&#xff0c;32…

Three.js--》Gui.js库的使用讲解

目录 Gui.js库基本使用 使用three自带gui库实现基本操作 gui库实现下拉菜单和单选框 gui库分组方法实现 使用dat.gui第三方库 Gui.js库基本使用 gui.js说白了就是一个前端js库&#xff0c;对HTML、CSS和JavaScript进行了封装&#xff0c;学习开发3d技术时借助该库可以快速…

230502-LLM-Vicuna介绍、安装与注意事项整理

最终效果 在对话过程中&#xff0c;GPU与CPU均会有波动&#xff0c;但是主要还是CPU波动为主 相关资料 序号链接说明001本地CPU6G内存部署类ChatGPT模型&#xff08;Vicuna 小羊驼&#xff09; - 知乎极简安装版本&#xff0c;只支持CPU与命令行002最新开源语言模型 Vicuna 媲…