C++入门基础(二)

news2024/12/23 14:48:01

目录

  • 缺省参数
    • 缺省参数概念
    • 缺省参数分类
      • 全缺省参数
      • 半缺省参数
      • 声明与定义分离
    • 缺省参数的应用
  • 函数重载
    • 函数重载概念
      • 例子1 参数类型不同
      • 例子2 参数的个数不同
      • 例子3 参数的顺序不同
    • C++支持函数重载的原理--名字修饰(name Mangling)

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录

缺省参数

缺省参数概念

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

voivoid Func(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Func();
	Func(10);

	return 0;
}

在这里插入图片描述
Func括号中的int a=0就是函数的缺省值
当我们在调用函数的时候,如果没有传入参数,那么就会让a=0作为我们传入的参数
当我们调用函数时,传入了参数10,那么传入的参数a就不等于0,而是等于10

许多函数传入的参数不止一个,缺省参数也是一样的

缺省参数分类

全缺省参数

 void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

在这里插入图片描述
当只传两个参数时,打印的结果为
在这里插入图片描述
显然传入参数的顺序是从左往右依次开始传的
有的人想用Func(,1,2)这种方法去表示1为传给b的参数,2为传给c的参数,事实上这样是不行的
在这里插入图片描述

半缺省参数

void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
2. 缺省参数不能在函数声明和定义中同时出现
3. 半缺省是缺省部分参数

声明与定义分离

//.h文件
int add(int a = 6, int b = 4);
  
  // .cpp文件
int add(int a = 2, int b = 3)
{
	return a + b;
}

代码运行后会报错,重复默认参数,因为a和b在.h文件和.cpp文件中的缺省参数值不同起了冲突
在这里插入图片描述
如果.h文件和.cpp文件缺省参数值都相同时

//.h文件
int add(int a = 6, int b = 4);
  
  // .cpp文件
int add(int a = 6, int b = 4)
{
	return a + b;
}

在这里插入图片描述

那如果.h文件中我们不用缺省参数,而.cpp用缺省参数会怎么样

.h文件
int add(int a , int b );
.cpp文件
int add(int a=2 , int b=3 )
{
	return a + b;
}

在这里插入图片描述

这次只让.h文件用缺省参数

.h文件
int add(int a=6 , int b=4 );
.cpp文件
int add(int a , int b)
{
	return a + b;
}

在这里插入图片描述
综上声明和定义分离时缺省参数只能在声明给(.h文件),因为在test.cpp文件中要包含#include< xxx.h>文件,而包含了头文件后,编译器在预处理阶段会将头文件内容展开(把头文件的代码拷贝过来)
就相当于下面这段代码

int add(int a = 6, int b = 4);
int main()
{
	cout << add() << endl;
	return 0;
}

但是由于只有一个函数的声明,我们还需要找到函数的地址(函数具体实现的地方),想要找到函数实现的地址,就要了解编译器的几个阶段:预处理->编译->汇编->链接,
预处理是将头文件展开,宏替换(#define),条件编译(if…),去掉注释
编译是检查语法,然后生成汇编代码
汇编将汇编代码转换成二进制的机器码
在链接的时候会将包含的头文件和test.cpp等等文件合并到一起,然后根据函数的名称去帮你找到具体实现函数的地址
所以在最后链接的时候,会帮你找到函数的地址,如果找不到就会报错

补充:缺省参数的缺省值必须是常量或者全局变量,C语言不支持确实参数(编译器不支持)

缺省参数的应用

下面是之前我们写栈的代码,因为这个栈是数组实现的,在扩容的时候比较麻烦,并且经常会消耗空间

typedef struct stack//数组栈
{
	int* a;
	int top;//栈顶
	int capacity;空间
}ST;
void STInit(ST* pst)//栈的初始化
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0//或者pst->top = -1;
}
void STPush(ST* pst, STDataType x)//栈的插入和扩容
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

假设这个栈需要插入100个数据,根据上面的代码,扩容的过程如下
在这里插入图片描述
产生这个情况的原因就是因为这句代码STDataType* tmp = realloc(pst->a, sizeof(STDataType) * newcapacity),因为sizeof(STDataType) * newcapacity把扩容给写死了,每次扩容都是二倍的方式去括,而且有时扩容后的空间非常大,我们并不需要那么大的空间,就导致空间浪费

而有了缺省参数这个方法后,扩容的问题就得到了解决
我们只需要在栈的插入函数中加入缺省参数n=4
当栈为空时,就直接让栈扩容
当我们想要插入100个数据的时候,就给n传100
而当我们不知道要插入多少个数据的时候,就不给n传值,虽然可能会有空间浪费,但是问题不大

void STPush(ST* pst, STDataType x,int n=4)//栈的插入和扩容
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity  == n;
		STDataType* tmp = realloc(pst->a, sizeof(STDataType) * n);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了

函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数
这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

例子1 参数类型不同

int Add(int a, int b)
{
	cout << "int add(int a, int b) " << endl;
	return a + b;
}
double Add(double a, double b)
{
	cout << "double add(double a, double b) " << endl;
	return a + b;
}
int main()
{
	Add(1, 2);
	Add(1.0, 1.2);
	return 0;
}

在这里插入图片描述

例子2 参数的个数不同

int Add(int a, int b)
{
	cout << "int add(int a, int b) " << endl;
	return a + b;
}
int Add(int a)
{
	cout << "int add(int a) " << endl;
	return a ;
}
int main()
{
	Add(1, 2);
	Add(1);
	return 0;
}

在这里插入图片描述

例子3 参数的顺序不同

int Add(int a, double b)
{
	cout << "int add(int a, int b) " << a+b<<endl;
	return a + b;
}
int Add(double b,int a)
{
	cout << "int add(int a) " <<a+b<< endl;
	return a+b ;
}
int main()
{
	Add(1, 2.0);
	Add(1.0,2);
	return 0;
}

在这里插入图片描述

C++支持函数重载的原理–名字修饰(name Mangling)

在上面的缺省函数中有提到过,C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接

为什么C++和C语言都要经历这几个阶段,而C++却可以支持函数重载呢?

在C语言实现声明和定义的分离时,如果函数名重复,那么编译器在链接的过程中会根据函数名去找函数的地址,而由于函数名重复,导致分不清具体是要用哪个函数,所以会报链接错误
在这里插入图片描述
而C++却可以
在这里插入图片描述
所以C++和C语言在链接部分是有一些不同的
事实上C++在链接中并不是直接用函数名去找地址,而是根据不同的参数类型,返回值的类型等等用一些手段去修饰函数,各个编译器的方式是不一样的

我们以linux为例

int add(int a, int b)
{
	return a + b;
}

这个函数在修饰后为-Z3addii,其中3为函数名长度,后面两个i为参数类型

double add(double a, double b)
{
	return a + b;
}

这个函数在修饰后为-Z3adddd

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

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

相关文章

nginx+Tomcat动静分离

本⽂的动静分离主要是通过nginxtomcat来实现&#xff0c;其中nginx处理图⽚、html等静态的⽂ 件&#xff0c;tomcat处理jsp、do等动态⽂件. 实验环境 192.168.200.133 nginx反向代理 192.168.200.129 static 192.168.200.130 dynamic 步骤 修改三台主机名 [rootadmin ~]#…

《Redis使用手册之列表》

《Redis使用手册之列表》 目录 **《Redis使用手册之列表》****LPUSH&#xff1a;将元素推入列表左端****LPUSHX、RPUSHX&#xff1a;只对已存在的列表执行推入操作****LPOP&#xff1a;弹出列表最左端的元素****RPOP&#xff1a;弹出列表最右端的元素****RPOPLPUSH&#xff1a;…

【C语言刷题系列】删除公共元素

目录 一、问题描述 二、解题思路 三、源代码实现 解决方案一&#xff1a;拷贝到临时数组 解决方案二&#xff1a;直接打印 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 一、问题描述 二、解题思路 第一种方法&…

线上告警炸锅!FastJson 又立功了。。

前段时间新增一个特别简单的功能&#xff0c;晚上上线前review代码时想到公司拼搏进取的价值观临时加一行log日志&#xff0c;觉得就一行简单的日志基本上没啥问题&#xff0c;结果刚上完线后一堆报警&#xff0c;赶紧回滚了代码&#xff0c;找到问题删除了添加日志的代码&…

3.C++动态内存管理(超全)

目录 1 .C/C 内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3 operator new函数 3.4 定位new表达式(placement-new) &#xff08;了解&#xff09; 4. 常…

iA Writer for Mac:简洁强大的写作软件

在追求高效写作的今天&#xff0c;iA Writer for Mac凭借其简洁而强大的功能&#xff0c;成为了许多作家、记者和学生的首选工具。这款专为Mac用户打造的写作软件&#xff0c;以其独特的设计理念和实用功能&#xff0c;助你轻松打造高质量的文章。 iA Writer for Mac v7.1.2中文…

C语言(操作符)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…

Java并发编程面试问题与答案

1. 什么是线程安全&#xff1f; 答&#xff1a; 线程安全意味着多个线程可以同时访问一个类的实例而不引起任何问题或不一致的结果。线程安全的代码会通过同步机制来确保所有线程都能正确地访问共享资源。 2. 解释Java中的synchronized关键字。 答&#xff1a; synchronized…

Q1营收稳健增长,云从科技如何在“百模大战”的险中求稳?

自从迈入大模型时代&#xff0c;AI行业可谓“一天一个样”。越来越多的企业涌现&#xff0c;舆论热议从未断绝。 但就像所有技术必须经历的那些考验&#xff0c;在现实尺度下&#xff0c;AI顺利走进商业化世界&#xff0c;仍然是少部分玩家掌握的稀缺能力。个中原因不尽相同&a…

解决“未能正确加载QtVsToolPackage包“问题

今天&#xff0c;在使用VS2019Qt插件时&#xff0c;弹出"未能正确加载QtVsToolPackage包"错误&#xff0c;如图(1.1)所示&#xff1a; 图(1.1) 报"未能正确加载QtVsToolsPackage包"错误 出现这种现象的原因是: qt-vsaddin升级失败或者版本不兼容&#xff0…

动手学深度学习3.6 softmax回归的从零开始实现-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;Softmax 回归从零开始实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;3.6. softmax回归的从零开…

物联网实战--平台篇之(二)基础搭建

目录 一、Qt工程创建 二、数据库知识 三、通信协议 四、名词定义 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、Qt工程…

GoLang Gin实际使用

所有代码同步到Admin/gitDemo - Gitee.comhttps://gitee.com/mec-deployment-team_0/git-demo/tree/dev/ 1.创建Gin框架 一般设计一个常规的web项目&#xff0c;都需要以下几个模块 runApp 主函数&#xff0c;运行整个项目routes 路由控制&#xff0c;管理跳转以及路由分组co…

kubectl_入门_Pod调整

Pod调度 在默认情况下&#xff0c;一个pod在哪个node节点上运行&#xff0c;是由scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。 但是在实际过程中&#xff0c;这并不满足需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些pod到达某…

基于昇腾AI | 英码科技EA500I使用AscendCL实现垃圾分类和视频物体分类应用

现如今&#xff0c;人工智能迅猛发展&#xff0c;AI赋能产业发展的速度正在加快&#xff0c;“AI”的需求蜂拥而来&#xff0c;但AI应用快速落地的过程中仍存在很大的挑战&#xff1a;向下需要适配的硬件&#xff0c;向上需要完善的技术支持&#xff0c;两者缺一不可。 基于此&…

【C语言】深入了解文件:简明指南

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

香港上市现货比特币及以太坊ETF,首日交易量不及预期

原创 | 刘教链 在BTC&#xff08;比特币&#xff09;继续回调至61k一线&#xff0c;眼见就要在连续7个月收涨后&#xff0c;终于迎来一个收跌的4月之际&#xff0c;香港如期上市了现货比特币ETF和以太坊ETF&#xff0c;成为全球继美国推出现货比特币ETF之后&#xff0c;亚洲首个…

Aker(安碁科技)晶振产品应用和选型

一、石英晶体振荡器简介 在电子电路系统中&#xff0c;特定的动作需要严格按照一定的顺序进行&#xff0c;以确保数据被正确处理和操作&#xff0c;时钟信号就成了系统工作的重要引导者。而且在多模块复杂电路系统中&#xff0c;为了确保不同功能模块能协调一致地工作&#xf…

网络安全是智能汽车下一个要卷的方向?

2024年一季度&#xff0c;中国汽车市场延续了2023年的风格&#xff0c;核心就是「卷」。 2023年&#xff0c;我国汽车市场爆发「最强价格战」&#xff0c;燃油车的市场空间不断被挤压&#xff0c;如今只剩下最后一口气。近日乘联会发布4月1-14日最新数据&#xff0c;新能源&am…