C++篇----auto、内联函数、函数重载

news2024/11/18 20:42:14

文章目录

  • 一、auto
  • 二、内联函数(inline)
  • 三、函数重载


一、auto

auto在c++中是会根据等号右边表达式自动推导等号左边的类型

#include<iostream>
using namespace std;

int main()
{
	int a = 0;
	auto b = a;

	double c = 1.1;
	auto d = c;

	//打印类型typeid().name()
	cout << typeid(b).name() << endl;
	cout << typeid(d).name() << endl;

	return 0;
}

在这里插入图片描述
什么情况下auto会被使用?

auto适用于右边表达式类型很长的情况,相当于类型的替换

还有一种情况,范围for 数组访问时,每次都要判断,且自增或者调整 用auto

for(auto e:arr)这样就可以将数组数据依次赋值给e,然后可以将其得到的值插入cout显示到控制台
:会自动迭代,自动判断结束,但是:只针对数组,其它就不行

#include<iostream>
using namespace std;

int main()
{
	int arr[] = { 1,2,3,4,5 };
	//这样就可以访问了,但是这样要修改数组内容应该如何办到
	for (auto e : arr)//根据左边类型自动为e匹配类型,且:将数组值依次赋值给e
		cout << e << ' ' ;
	cout << endl;

	/*for (auto e : arr)
		e *= 2;
	for (auto e : arr)
		cout << e << ' ';*/
	//在auto后面加引用操作符&,auto为变量e自动匹配类型,&就是对数组每个元素的引用,改变e就是改变数组

	/*for (auto& e : arr)//引用修改数组值
		e *= 2;
	for (auto e : arr)
		cout << e << ' ';*/
	return 0;
}

在这里插入图片描述

二、内联函数(inline)

在调用函数时需要建立栈帧,在栈上开辟一块空间,要压栈,也要使用很多寄存器做临时变量拷贝去拷贝来有一定的消耗
对于那种重复调用的函数,这种消耗尤为明显,函数调用一次,就会建立一个栈帧,当某个函数被调用n次时,会建立n个栈帧
建立这些栈帧消耗太大了,那么如何能够降低或者减少哦这种因建立栈帧带来的消耗

c语言中可以用宏函数来实现对于重复调用的函数

#include<iostream>
using namespace std;
//宏函数实现,宏中的函数参数没有给其声明类型,且没有返回(return)这个关键字,
//除了函数名之外的所有变量每个变量都要用括号括起来
#define Add(x,y) ((x)+(y))

int main()
{
	for (int i = 0; i < 10000; i++)
		Add(1, 2);
	return 0;
}

但是并不是所有都适用宏,宏也有其优缺点

优:在调用函数时不需要建立栈帧,提高调用效率,当需要该函数中某个值时可以直接在宏出修改,不必到函数中去一 一修改
缺:复杂、容易出错、可读性差(函数时,参数你在读的时候不知道参数是什么类型)、不能调试

那么c++如何解决?

对于这种大量重复调用某个函数时,c++用内联函数

在这里插入图片描述

内联函数:就是在调用函数的地方将函数展开,并不像普通函数在调用函数时需要建立栈帧
内联函数在调用函数时不用建立栈帧,将函数展开,减少了因建立栈帧带来的消耗
但是将这个函数展开就要使用额外的空间,这种方法是以空间换时间的方法
且展开时,如果函数中代码量过大,那么就会导致可执行程序变大代码膨胀
所以内联函数是适用于那种重复调用且代码量很少的函数(一般不超过十行的代码量)

那么内联不适用于哪些函数?

函数中代码量多
递归函数

虽然我们使用inline使函数成为内联函数了,对于我们来说可以给任意函数变成内联函数,但是这只是我们给编译器的建议,至于是否采纳还看编译器对于这个函数能否成为内联的判断,如果函数中代码量过多或者是递归函数编译器是不会采纳的

而且还要注意内联函数在声明和定义不能分离,由于声明时就将函数展开了,如果在另外定义,此时链接时去调用找其地址,根本找不到
在这里插入图片描述

三、函数重载

函数重载:也就是相当于汉语中的一词多义的意思,有时候一个汉字它有多个意思
而函数重载也是一词多义,一个函数名它虽然它实现的功能雷士,但是它具体的参数不相同
参数不相同(参数类型、参数个数、参数类型顺序)多个函数功能实现上是类似的,只是在具体细节上有些许差异
同一个函数名代表函数实现功能类似,只是形参数据类型存在差异 c++允许函数名相同

c语言不允许相同的函数名出现 函数同名时,在调用函数时不知道调用谁,

参数类型

#include<iostream>
using namespace std;

//参数类型不同
void fun(int a)
{
	cout << "fun(int a)" << endl;
}

void fun(double a)
{
	cout << "fun(double a)" << endl;
}

int main()
{
	fun(1);
	fun(1.2);

	return 0;
}


参数个数

#include<iostream>
using namespace std;

参数个数不同
void fun(int a, int b)
{
	cout << "fun(int a,int b)" << endl;
}

void fun(int a)
{
	cout << "fun(int a)" << endl;
}

int main()
{
	fun(1,2);
	fun(1);

	return 0;
}

在这里插入图片描述

参数类型顺序

#include<iostream>
using namespace std;
//参数类型顺序不同
void fun(int a, double b)
{
	cout << "fun(int a, double b)" << endl;
}

void fun(double a, int b)
{
	cout << "fun(double a, int b)" << endl;
}

int main()
{
	fun(1, 1.1);
	fun(1.1, 1);

	return 0;
}


在这里插入图片描述

在这里插入图片描述

函数缺省参数能否构成重载,构成,但是如果在调用该函数传参时,两个函数什么都不传时,不构成函数重载,调用存在歧义

c语言函数在调用时,call指令只给其转成了一个函数地址名
c语言不支持函数重载。因为在链接时,调用该函数的地址,调用同一个函数名,此时调用有多个地址
编译器不知道去找哪个地址,所以c语言不支持函数重载。 c语言并没有函数名修饰规则,在编译调用函数时并没有将函数名改变
所以在链接找地址时(找的是函数名),由于存在多个地址,当一个调用时并不知道找的是哪个地址,调用存在歧义
在这里插入图片描述

c++中,在调用时压栈,每个函数压栈的地址不一样,用同一个函数压栈过后它们函数名会发生变化,这种变化
遵循函数名修饰规则,在调用函数时,在linux下c++将参数名带入了函数名,一般以_Z为函数名前缀然后_Z+数字(原函数名字符个数)+调用函数它的参数类型缩写,
其后有多少个字符就表示形参类型有多少个,类型缩写为其类型首字符
在链接时找它的地址时找函数名,此时它们的函数名都不一样,当然可以调用,各个函数名不同也就不会存在调用歧义
函数名修饰规则:将函数参数带入函数名中
在这里插入图片描述
在这里插入图片描述
在linux下,c++将参数类型带入了函数名,所有这也是为什么在调用时不会存在调用歧义的原因

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

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

相关文章

OpenGL与Metal API的Point Sprite

我们在实际用OpenGL等3D图形渲染API时 点图元 往往用得不多&#xff0c;而在粒子系统中可能也是用一个正方形来绘制一单个粒子。不过在当前大部分3D图形渲染API中都能支持用点图元来绘制一个具有纹理贴图的粒子&#xff0c;从早在OpenGL 1.4开始就能支持了&#xff0c;而在Open…

机器学习:基于逻辑回归(Logistic Regression)对股票客户流失预测分析

基于逻辑回归对股票客户流失预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1…

npm install报错

出现这个错误&#xff0c;我百度之后得到的解决方案是&#xff1a; 在node.js安装目录下找到node_modules文件夹并删除 但是当我操作完成之后&#xff0c;却出现了另外一个ERROR&#xff1a; 于是我又还原了原来的node_modules文件夹&#xff0c;于是又报一开始的错 仔细瞅瞅…

Netty 单机百万连接测试

1.Netty框架简介 1.1.Netty简介 netty是jboss提供的一个java开源框架&#xff0c;netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可用性的网络服务器和客户端程序。也就是说netty是一个基于nio的编程框架&#xff0c;使用netty可以快…

NFC 学习笔记 5 MFRC522读写器2 NDEF

NDEF简介 NDEF&#xff08;NFC Data Exchange Format&#xff09;是一种标准化的数据格式&#xff0c;用于将数据存储在NFC标签或智能手机中。该格式是NFC论坛定义的&#xff0c;目的是在不同的NFC设备之间交换信息。 NDEF格式可以存储各种类型的数据&#xff0c;例如URL、文本…

面对市场内卷,不同品牌应该如何做客户增长?

后疫情时代&#xff0c;我国新生人口减少、人口老龄化加剧&#xff0c;chatgpt火爆和AI替代论盛行&#xff0c;市场上&#xff0c;口红效应依旧繁荣&#xff0c;消费者的延迟满足、替代性满足成为常见心理&#xff0c;面对宏观的不确定性&#xff0c;人们在消费上更需要确定性的…

github 基础

github 基础 前面讲了 git 的基本使用&#xff0c;这里简单的提一下 github 的基本使用&#xff0c;主要还是 pull 和 push 两个部分。其中 pull 好像有了一些变化&#xff0c;现在似乎是需要 rebase 而不是自动就帮你做了……&#xff1f;不过 rebase 的部分之后再提。 当然…

Vuex实现数据共享

目录 一&#xff1a;index.js的创建 二&#xff1a;index.js的引入 三&#xff1a;Count.vue 四&#xff1a;App.vue的使用 五&#xff1a;mapstate等的使用 五&#xff1a;多组件数据共享&#xff08;模块化编程&#xff09; vc通过dispatch联系actions&#xff0c;acti…

Python小姿势 - ###### 随机选取的知识点:Python日期时间处理

随机选取的知识点&#xff1a;Python日期时间处理 Python日期时间处理&#xff1a;一种更简单的方式 日期和时间处理是许多程序中必不可少的部分。Python提供了一个标准库来处理日期和时间&#xff0c;这个库叫做datetime&#xff0c;它提供了一些类来处理不同的日期和时间格式…

远程访问及控制(SSH)

远程访问及控制&#xff08;SSH&#xff09; 一、SSH远程管理二、SSH服务1、ssh远程登录方式2、scp远程复制3、sftp安全FTP4、sshd配置文件5、ssh密钥对配置5.1 ssh密钥对免交互登录 三、TCP wrappers 访问控制1、**TCP wrappers &#xff08;TCP封套&#xff09;**2、**TCP wr…

会话与会话技术(Cookie)

Web应用中的会话过程指的是一个客户端&#xff08;浏览器&#xff09;与Web服务器之间连续发生的一系列请求和响应过程 为保存会话过程产生的数据&#xff0c;Servlet提供了两个用于保存会话数据的对象&#xff0c;分别是Cookie和Session 1、Cookie对象 Cookie是一种会话技术…

SS524V100 RTL8152B(USB转网卡)驱动移植

目录 前言 1. 内核下 USB Host 配置过程 2. 内核下 RTL8152 驱动配置 3. 重新编译内核 4. 测试USB转网卡 5. 总结 前言 本文主要是描述 SS524V100 对 RTL8152B(百兆网卡) 开发、移植的过程。 1. SS524V100 的 USB 2.0 支持 Host 模式&#xff1b; 2. 内核默认自带驱动…

0环境教你怎么安装配置GPU环境运行车流量检测代码

项目效果&#xff1a; python车流量检测双向车流计数 1、环境配置 1.1 安装显卡加速工具 (1) 安装CUDA和cudnn NVIDIA CUDA 深度神经网络库 (cuDNN) 是经 GPU 加速的深度神经网络基元库。cuDNN 可大幅优化标准例程&#xff08;例如用于前向传播和反向传播的卷积层、池化层、…

4月23日作业

#include <iostream> #include <cstring> using namespace std; class Student //学生类 { private: string name; //姓名 int year; //年龄 double sorce; //分数 public: Student (){} //无参构造 Student(string a,int b,double c):name(a),y…

五分钟学会在微信小程序中使用 vantUI 组件库

前言 我们在开发微信小程序时&#xff0c;设计和实现好用的用户界面无疑是至关重要的一步。但是微信小程序官方自带的 UI 组件库无法满足很多使用场景&#xff0c;这个时候就需要我们使用一些第三方的 UI 组件库。而 vant Weapp 作为一款优秀的前端 UI 组件库&#xff0c;可以帮…

MP长篇综述 | 植物泛基因组及其应用

2022年12月15日&#xff0c;中山大学史俊鹏副教授、中国科学院遗传与发育生物学研究所田志喜研究员、中国农业大学赖锦盛教授和上海师范大学黄学辉教授共同撰文&#xff0c;在Molecular Plant杂志发表了题为“Plant pan-genomics and its applications”的长篇综述。该论文对植…

(Ubuntu22.04 Jammy)安装ROS2 Humble

文章目录 (Ubuntu22.04 Jammy)安装ROS2 (Humble)版本一、设置本地区域二、设置源三、安装ROS2软件包四、环境设置五、测试用例Talker-listener 六、卸载ros2 (Ubuntu22.04 Jammy)安装ROS2 (Humble)版本 提示&#xff1a;以下内容是已经安装了ubuntu22.04 下进行安装ros2 一、设…

iptables防火墙和Firewalld

引言 在 Internet 中&#xff0c;企业通过各种应用系统来为用户提供各种服务&#xff0c;如 Web 网站、电子邮件系统、FTP 服务器、数据库系统等&#xff0c;那么&#xff0c;如何来保护这些服务器&#xff0c;过滤企业不需要的访问甚至是恶意的入侵呢&#xff0c;接下来&#…

设计模式--建造者模式

项目需求 盖房需求 (1) 需要建房子:过程为 打地基 砌墙 封顶 (2) 房子有高正各样的,比如 平房和高楼 建房子的过程虽然都一样 但是要求不要相同的细节 传统方式 public abstract class TraditionBuild {//打地基public abstract void foundation();//砌墙public abstract voi…

Linux进程的fork、exit、wait等函数;区分父子进程;GDB调试多进程

Linux系统中进程可以创建子进程。 1. fork函数&#xff1a;创建新进程 #include<sys/types.h> #include<unistd.h>pid_t fork(void); /* 功能&#xff1a;一个进程创建新进程。原进程为父进程&#xff0c;新进程为子进程。 返回值&#xff1a;成功&#xff1a;子…