C++入门基础(二)

目录

  • 缺省参数
    • 缺省参数概念
    • 缺省参数分类
      • 全缺省参数
      • 半缺省参数
      • 声明与定义分离
    • 缺省参数的应用
  • 函数重载
    • 函数重载概念
      • 例子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.rhkb.cn/news/317072.html

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

相关文章

Visual Studio导入libtorch(Cuda版)

Visual Studio导入libtorch&#xff08;Cuda版&#xff09; 一、安装 官网&#xff1a;https://pytorch.org/get-started/locally/ 相应地选择并下载 二、环境变量配置 解压zip&#xff0c;得到libtorch文件夹&#xff0c;将libtorch\lib和libtorch\bin对应路径添加到系统环…

使 Elasticsearch 和 Lucene 成为最佳向量数据库:速度提高 8 倍,效率提高 32 倍

作者&#xff1a;来自 Elastic Mayya Sharipova, Benjamin Trent, Jim Ferenczi Elasticsearch 和 Lucene 成绩单&#xff1a;值得注意的速度和效率投资 我们 Elastic 的使命是将 Apache Lucene 打造成最佳的向量数据库&#xff0c;并继续提升 Elasticsearch 作为搜索和 RAG&a…

【JVM】简述类加载器及双亲委派机制

双亲委派模型&#xff0c;是加载class文件的一种机制。在介绍双亲委派模型之前&#xff0c;我需要先介绍几种类加载器&#xff08;Class Loader&#xff09;。 1&#xff0c;类加载器 Bootstrap&#xff0c;加载lib/rt.jar&#xff0c;charset.jar等中的核心类&#xff0c;由…

JWT是什么?如何使用?

JWT是什么&#xff1f;如何使用&#xff1f; 前言什么是JWT&#xff1f;概念工作方式JWT的组成HeaderPayloadSignatrue 实战引入依赖自定义注解定义实体类定义一个JWT工具类业务校验并生成token定义拦截器配置拦截器定义接口方法并添加注解开始验证 使用场景注意事项 JWT与传统…

ASR语音转录Prompt优化

ASR语音转录Prompt优化 一、前言 在ASR转录的时候&#xff0c;我们能很明显的感受到有时候语音识别不是很准确&#xff0c;这过程中常见的文本错误主要可以归纳为以下几类&#xff1a; 同音错误&#xff08;Homophone Errors&#xff09; 同音错误发生在不同词语发音相似或相…

用Excel做一个功能完备的仓库管理系统

1 基本设计思路 用到的Excel技术&#xff1a;sumif, vlookup, 表格(table)。基本思路&#xff1a;在有基础的商品、仓库等信息的情况下&#xff0c;对商品的每一个操作都有对应的单据&#xff0c;然后再汇总统计。标识&#xff1a;为了在不同的维度统计数量&#xff0c;各单据…

谷粒商城实战(020 RabbitMQ-消息确认)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第258p-第p261的内容 消息确认 生产者 publishers 消费者 consumers 设置配置类 调用api 控制台 抵达brocker 代理 新版本ReturnCallbac…

matlab学习005-利用matlab设计滤波器

目录 一&#xff0c;含有多个频率成分的三角信号 1&#xff0c;以采样频率fs20KHz对信号采样&#xff0c; 画出信号的波形&#xff1b; 1&#xff09;前期基础 2&#xff09;波形图 3&#xff09;代码 2&#xff0c;选取合适的采样点数&#xff0c;利用DFT分析信号的…

Baidu Comate:“AI +”让软件研发更高效更安全

4月27日&#xff0c;百度副总裁陈洋出席由全国工商联主办的第64届德胜门大讲堂&#xff0c;并发表了《深化大模型技术创新与应用落地&#xff0c;护航大模型产业平稳健康发展》主题演讲。陈洋表示&#xff0c;“人工智能”成为催生新质生产力的重要引擎&#xff0c;对于企业而言…

【禅道客户案例】同方智慧能源数智化转型新实践 禅道助力前行

同方智慧能源是同方股份有限公司的骨干企业。依托中核集团、清华大学的科技优势&#xff0c;坚持技术和资源双核驱动&#xff0c;基于30多年行业积淀&#xff0c;面向建筑、交通、工业、北方供热、数据中心等主要用能场景提供设计咨询、产品技术、投资建设、运营服务&#xff0…

四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(OpenCvSharp)

功能实现&#xff1a; 对指定图片上进行绘制线段、矩形、圆、椭圆、自定义多边形、边缘轮廓以及自定义文本 一、布局 用到了一个pictureBox和八个button 二、引入命名空间 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.F…

如何有效的将丢失的mfc140u.dll修复,几种mfc140u.dll丢失的解决方法

当你在运行某个程序或应用程序时&#xff0c;突然遭遇到mfc140u.dll丢失的错误提示&#xff0c;这可能会对你的电脑运行产生一些不利影响。但是&#xff0c;不要担心&#xff0c;以下是一套详细的mfc140u.dll丢失的解决方法。 mfc140u.dll缺失问题的详细解决步骤 步骤1&#x…

VTK —— 二、教程五 - 通过鼠标事件与渲染交互(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

C语言-嵌入式-STM32:FreeRTOS说明和详解

Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;FreeRTOS&#xff0c;RTX&#xff0c;RT-Thread 等这些都…

Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件 买了个USB可转IIC、或SPI、或UART的设备&#xff0c;主芯片是CH341A 主要说明USB转SPI的应用&#xff0c;绿色跳线帽选择IIC&SPI&#xff0c;用到CS0、SCK、MOSI、MISO这4个引脚 2、软件 2.1、下载CH341A的驱动 点CH341A官网https://www.wch.cn/downloads/CH34…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

Qt中常用对话框

Qt中的对话框&#xff08;QDialog&#xff09;是用户交互的重要组件&#xff0c;用于向用户提供特定的信息、请求输入、或进行决策。Qt提供了多种标准对话框以及用于自定义对话框的类。以下将详细介绍几种常用对话框的基本使用、使用技巧以及注意事项&#xff0c;并附带C示例代…

小程序wx.getlocation接口如何开通?

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由…

AI图书推荐:将 ChatGPT和Excel融合倍增工作效率

《将 ChatGPT和Excel融合倍增工作效率》&#xff08; Hands-on ChatGPT in Excel. Enhance Your Excel Workbooks&#xff09;由Mitja Martini撰写&#xff0c;旨在教授读者如何将ChatGPT与Excel结合使用&#xff0c;以提升工作效率和创造AI增强的Excel工具。它还提供了Excel中…

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…