C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数

        在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数,就是在编译时C++编译器会将函数体在调用内联函数的地方展开,从而省去了调用函数的栈帧开销,提高程序运行效率。

inline int Add(int a, int b)
{
	return a + b;
}
int main()
{
	int c = 0;
	c = Add(1, 2);
	return 0;
}

        对上述代码,在Debug版本下,我们观察汇编代码,发现仍然调用了函数Add而不是我们希望的内联展开形式。

        这是因为内联函数展开后就不可调试了,而Debug版本为了方便我们调试,因此忽略了inline的选项。为了可以看到内联函数的变化,我们可以做出如下设定,再在X86环境下编译程序,这样Debug版本也可以实现内联了。或者使用release版本也可以,release会自动对其进行优化,变为内联展开。

        对内联函数做以总结:

①内联函数inline实际上是一种以空间换时间的做法,因为编译器在处理内联函数时会使用函数体替换函数调用,这样会使得目标文件变大,但是省去了调用,提高了效率。

②对于inline的使用,一般将规模小、非递归、频繁调用的函数采取inline修饰。而且inline修饰并不是一定会替换调用,只是向编译器表达内联的希望,具体是否内联要取决于编译器,所以复杂又庞大的函数编译器会忽略内联的请求。 

③inline不建议声明与定义分离,这可能会导致需要展开函数时找不到函数体导致链接错误。

7. auto关键字

        在C语言中变量一般有三种类型:①auto:自动变量(局部变量),一般省略不写;②static:静态区变量;③extern:外部变量。在C++中,对auto做了新的定义,auto是类型指示符,他可以充当类型声明的占位符,根据初始化类型替换为实际类型。

int func()
{
	return 9;
}
int main()
{
	//auto可以根据初始化表达式推导实际类型
	auto a = 1;
	auto b = 1.24;
	auto c = "hello";
	auto d = func();
	//typeid(变量).name()  可以打印出符号的类型
	cout << typeid(a).name() << endl;	//int
	cout << typeid(b).name() << endl;	//double
	cout << typeid(c).name() << endl;	//char const* __ptr64
	cout << typeid(d).name() << endl;	//int

	return 0;
}

        在使用auto时需要注意以下几点:

①在使用auto来声明指针变量的时候,*号个数应小于等于指针级数,例如对四级指针,auto后的*小于等于4个都是可以的,但是不可以大于4个。

int main()
{
	int a = 1;
	auto p1 = &a;
	auto* p2 = &a;
	//auto* p3 = a; //error
	auto p3 = &p1;
	auto p4 = &p3;
	auto*** p5 = &p3;
	//auto**** p6 = &p3; //error
	cout << typeid(p1).name() << endl;	//int * __ptr64
	cout << typeid(p2).name() << endl;	//int * __ptr64
	cout << typeid(p3).name() << endl;	//int * __ptr64 * __ptr64
	cout << typeid(p4).name() << endl;	//int * __ptr64 * __ptr64 * __ptr64
	cout << typeid(p5).name() << endl;	//int * __ptr64 * __ptr64 * __ptr64
	return 0;
}

 ②在使用auto声明引用类型时,必须要加&。

int main()
{
	int a = 1;
	auto& ra = a;
	cout << typeid(ra).name() << endl;	//int
	return 0;
}

③当使用auto定义多个变量时,该行变量类型应该相同,因为编译器只会对第一个类型推导,然后以此结论定义剩下的变量。

int main()
{
	auto a = 1, b = 8;
	//auto c = 'k', d = 1.3; //error
	return 0;
}

④auto可以作为函数的返回类型,但不可以作为形参的类型。auto也不可以用来声明数组类型。

auto func1()
{
	return 1;
}
//int func2(auto c) error
//{
//	return 2;
//}
int main()
{
	auto a = func1();
	cout << typeid(a).name() << endl;	//int
	//auto b = func2(a);

    //auto arr[3] = {1, 2, 3};	//error
	return 0;
}

8.基于范围的for循环

        基于范围的for循环括号内冒号前是用于迭代的变量,冒号后是迭代的范围,也可以使用continue和break进行控制。暂时只介绍到数组,循环是从数组第一个元素到最后一个。

int main()
{
	int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	
	//1.一般的for循环
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
		cout << arr[i] << ' ';
	cout << endl;

	//2.基于范围的for循环
	for (int num : arr) //类似于python  ---  for num in arr:
		cout << num << ' ';
	cout << endl;

	return 0;
}

9.空指针nullptr

        在C语言我们所使用的空指针NULL实际上是一个宏,它可能被定义为0,同时也可能被定义为((void*)0)这样一个无类型指针。因此引入nullptr,定义它为((void*)0),代替以往NULL的使命。nullptr在C++中作为关键字存在。

void func(int a)
{
	cout << "int" << endl;
}
void func(int* a)
{
	cout << "int*" << endl;
}
int main()
{
	func(0);			//int
	func(NULL);			//int
	func((int*)NULL);	//int*
	func(nullptr);		//int*
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十一、计算机视觉-膨胀操作

文章目录 前言一、什么是膨胀二、膨胀操作的实现1.引入库 三、膨胀的原理 前言 上节我们学习了腐蚀操作&#xff0c;本节我们讲一下膨胀操作&#xff0c;膨胀和腐蚀实际上是相反的操作。上节我们把云峰这2个字周围没用的像素去掉了&#xff0c;但是云峰这2个字也变细了&#x…

Protocol Buffer-nanopb介绍

文章目录 一、需求二、环境三、相关概念3.1 protocol buffer介绍3.2 nanopb&#xff08;支持C语言&#xff09;3.3 proto文件 四、proto基本语法4.1 proto文件的定义4.2 字段规则4.3 字段类型4.4 字段编号4.5 proto语法4.6 进阶语法4.6.1 message嵌套4.6.2 enum关键字4.6.3 one…

【Flink精讲】Flink状态及Checkpoint调优

RocksDB大状态调优 RocksDB 是基于 LSM Tree 实现的&#xff08;类似 HBase&#xff09; &#xff0c;写数据都是先缓存到内存中&#xff0c; 所以 RocksDB 的写请求效率比较高。 RocksDB 使用内存结合磁盘的方式来存储数据&#xff0c;每 次获取数据时&#xff0c;先从内存中 …

什么是高可用架构

一、什么是高可用 在运维中&#xff0c;经常听到高可用&#xff0c;那么什么是高可用架构呢&#xff1f;通俗点讲&#xff0c;高可用就是在服务故障&#xff0c;节点宕机的情况下&#xff0c;业务能够保证不中断&#xff0c;服务正常运行。 举个例子&#xff0c;支付宝&#…

GS069——直流有刷电机调速电路 通过外接电阻网络,改变与之相接的 VMOS 管的输出,达到控制电动工具 转速的作用。 功耗小,电源电压范围宽。

GS069电动工具直流调速电路是CMOS专用集成电路&#xff0c;具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络&#xff0c;改变与之相接 的VMOS 管的输出&#xff0c;达到控制电动工具转速的作用。该电路输出幅值宽&#xff0c; 频率变化小&#xff0c;占空比…

vue ts html 中如何遍历 Enum 类型构建页面结构

vue ts html 中如何遍历 Enum 类型构建页面结构 一、需求 定义了一个 Enum 用来标记菜单类型&#xff1a; enum EnumMenuType {目录 1,菜单,按钮,外链 }你得 Enum 知道它的序号是随第一个定义的值自动增长的 现在想在 ElementUI 界面的 radio-group 中遍历它&#xff0c;…

聚集高速托盘类四向穿梭车ASRV|一车跑全仓可获得10000个货位的HEGERLS智能搬运机器人

随着国内外制造业加速转型升级&#xff0c;越来越多的企业需要进行物流智能化升级&#xff0c;但是往往受到仓库面积、高度、形状等现实条件的限制&#xff0c;以及市场不确定性因素的影响。因此&#xff0c;相对于投资传统的自动化立体库&#xff0c;企业更倾向于选择智能化、…

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

[设计模式Java实现附plantuml源码~行为型] 撤销功能的实现——备忘录模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

formality:set_constant应用

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: formality:形式验证流程 scan mode func的功能检查需要把scan mode设置成0。

python Matplotlib Tkinter-->导出pdf报表

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 reportlab 4.0.9 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox impor…

逆变器专题(9)-光伏并网逆变器PQ控制

相应仿真原件请移步资源下载 原理 跟网型并网逆变器通常采用PQ功率环并网&#xff0c;采用功率环并网通常可以进行设计其功率因数 如图所示&#xff0c;通过控制有功功率、无功功率的值&#xff0c;即可实现对功率因数的控制&#xff0c;通常情况下在并网时可将无功功率控为0&…

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

js实现鼠标拖拽改变div大小的同时另一个div宽度也变化

实现效果如下图所示 源码如下 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box {width: 100%;height: 300px; display: flex;}/*左侧div样式*/.left {width: calc(30% - 5px); /*左侧初始…

naive-ui-admin BasicTable 列表操作栏显示图标icon

效果图 在使用BasicTable的页面添加引用&#xff0c;这里随便弄了个icon import { GameController } from "vicons/ionicons5" 自定义列 const actionColumn reactive({width: 180,title: "操作",key: "action",fixed: "right",ren…

【高德地图】Android高德地图控件交互详细介绍

&#x1f4d6;第5章 与地图控件交互 ✅控件交互&#x1f9ca;缩放按钮&#x1f9ca;指南针&#x1f9ca;定位按钮&#x1f9ca;地图Logo ✅手势交互&#x1f9ca;缩放手势&#x1f9ca;滑动手势&#x1f9ca;旋转手势&#x1f9ca;倾斜手势&#x1f9ca;指定屏幕中心点的手势操…

Facebook的虚拟社交愿景:元宇宙时代的新起点

在当今数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分。而随着科技的不断进步和社会的发展&#xff0c;元宇宙已经成为了人们关注的热点话题之一。作为社交媒体的领军企业之一&#xff0c;Facebook也在积极探索虚拟社交的未来&#xff0c;将其视为元宇宙时…

社交媒体变革者:剖析Facebook对在线互动的贡献

随着数字化时代的蓬勃发展&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。在这个领域的发展中&#xff0c;Facebook作为先行者和领导者&#xff0c;对在线互动的演变和发展产生了深远的影响。本文将深入剖析Facebook在社交媒体领域的贡献&#xff0c;以及它对在…

贪心算法(算法竞赛、蓝桥杯)--排队接水问题

1、B站视频链接&#xff1a;A25 贪心算法 P1223 排队接水_哔哩哔哩_bilibili 题目链接&#xff1a;排队接水 - 洛谷 #include <bits/stdc.h> using namespace std; struct node{int t,id;//接水时间&#xff0c;编号bool operator<(node &b){return t<b.t;} …