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

news2024/11/16 5:57:22

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*
}

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

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

相关文章

【电子书】设计制作

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 设计制作 3D打印建模&#xff1a;Autodesk 123D Design详解与实战 第2版.epub3ds Max 2016中文版标准教程.epubAfter Effects CS 6影视特效与栏目包装实战全攻略(第2版&#xff09;.epubAfter E…

欧瑞康真空TTR91莱宝ITR90真空计KA09420GA09使用说明接线图

欧瑞康真空TTR91莱宝ITR90真空计KA09420GA09使用说明接线图

RocketMQ快速实战以及集群架构原理详解

RocketMQ快速实战以及集群架构原理详解 组成部分 启动Rocket服务之前要先启动NameServer NameServer 提供轻量级Broker路由服务&#xff0c;主要是提供服务注册 Broker 实际处理消息存储、转发等服务的核心组件 Producer 消息生产者集群&#xff0c;通常为业务系统中的一个功…

操作系统访问控制机制

使用访问控制技术&#xff0c;可以设置用户对系统资源的访问权限&#xff0c;即限定用户只能访问允许访问的资源。访问控制还可以通过设置文件的属性&#xff0c;来保护文件只能被读而不能被修改&#xff0c;或只允许核准的用户对其进行修改等。 1.1 保护域 把一个进程能对某…

11-pytorch-使用自己的数据集测试

b站小土堆pytorch教程学习笔记 import torch import torchvision from PIL import Image from torch import nnimg_path ../imgs/dog.png imageImage.open(img_path) print(image) # imageimage.convert(RGB)transformtorchvision.transforms.Compose([torchvision.transforms.…

stm32利用CubeMX完成按键控制LED灯的点亮与熄灭

首先画电图&#xff0c;如下&#xff1a;&#xff08;会话最小系统后就可以不画了&#xff0c;如果要是画实物的话必须要有的&#xff0c;不能忘&#xff0c;模拟就无所谓了&#xff09; 然后是CubeMX设置时钟 这次使用的是内部8M时钟&#xff0c;这样能避免proteus闪退的情况&…

虚 拟 化原理

1 概念&#xff1a; ①通俗理解&#xff1a; 虚拟化是在硬件和操作系统之间的实践 ②通过对计算机的服务层级的理解&#xff0c;理解虚拟化概念 抽离层级之间的依赖关系&#xff08;服务器虚拟化&#xff09; 2 虚拟化分类 ①按架构分类 ◆寄居架构&#xff1a;装在操作系统上…

鸿蒙LiteOS-M 内核初始化

目录 一、LiteOS-M 初始化内核二、LOS_KernelInit代码分析三、LOS_Start代码解析坚持就有收获 一、LiteOS-M 初始化内核 在LiteOS-M应用程序中&#xff0c;系统初始化如下&#xff1a; /*** brief This is the ohos entry, and you could call this in your main funciton af…

Flutter(一):安装和环境配置、创建Flutter项目

安装和环境配置、创建Flutter项目 Flutter 下载方式1方式2 Flutter 环境配置配置国内镜像站点解压 Flutter将 flutter 添加到系统环境变量中运行 flutter doctor来验证安装 Android Studio下载插件创建项目安装 Android SDK 工具在模拟器上运行 Flutter 下载 方式1 全版本&…

C++基础知识(四:类的学习)

类 类指的就是对同一类对象&#xff0c;把所有的属性都封装起来&#xff0c;你也可以把类看成一个高级版的结构体。 【1】定义 class 类名 { 访问权限:成员属性; 访问权限:成员方法; }访问权限&#xff1a; public:共有的&#xff0c;类内、类外和子类中都可以访问 private:私有…

Matlab: Introduction to Hybrid Beamforming

文章目录 来源混合波束赋形的基本概念System Setup 来源 在matlab的命令行输入 doc hybrid beamforming 混合波束赋形的基本概念 混合波束形成简介 本例介绍了混合波束形成的基本概念&#xff0c;并说明了如何模拟这种系统。 现代无线通信系统使用空间复用来提高散射体丰富…

创建者模式(Builder Pattern):构造复杂对象的通用解决方案

文章目录 **一、技术背景与应用场景****为何使用创建者模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、创建者模式定义与结构****三、使用步骤举例**四、优缺点分析总结 一、技术背景与应用场景 创建者模式是一种对象创建型设计模式&#xff0c;它通过将复…

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

高级语言期末2011级A卷

1.编写函数&#xff0c;判定正整数m和n&#xff08;均至少为2&#xff09;是否满足&#xff1a;数m为数n可分解的最小质因数&#xff08;数n可分解的最小质因数为整除n的最小质数&#xff09; 提示&#xff1a;判定m为质数且m是n的最小因数 #include <stdio.h> #include…

算法打卡day1|数组篇|Leetcode 704.二分查找、27.移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;可以方便的通过下标索引的方式获取到下标下对应的数据。 1.数组下标都是从0开始的。 2.数组内存空间的地址是连续的。 正是因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添…

Visual Studio 打开.edmx文件不显示表并报错:没有可用于.edmx的编辑器

打开.edmx文件时&#xff0c;呈现的是xml视图&#xff0c;不显示Diagram视图&#xff0c;且弹出报错“没有可用于.edmx的编辑器” 解决方案&#xff1a;在.edmx文件上右键&#xff0c;选择ado.net entity data model designer&#xff0c;即可正常显示表

mysql-MVCC

一、基础概念 1. MVCC的含义 MVCC (Multiversion Concurrency Control)&#xff0c;即多版本并发控制技术&#xff0c;它是通过读取某个时间点的快照数据&#xff0c; 来降低并发事务冲突而引起的锁等待&#xff0c; 从而提高并发性能的一种机制. MVCC 的实现,是通过保存数据…

N种方法解决1(CTF)

这里遇到的问题&#xff1a;一开始采用的base64解码平台有问题&#xff1b;默认解密出的格式为GBK格式&#xff1b;直接复制粘贴发现无法还原图片&#xff1b;又尝试了其他编码的&#xff1b;发现只有hex格式可以保证图片正常还原&#xff1b; 图片是以二进制存储的&#xff1…

响应式页面兼容移动端

文章目录 1. 响应式开发1.1 原理1.2 响应式容器 2. Bootstrap前端开发框架2.1 Bootstrap介绍(1) 优点(2) 版本 2.2 Bootstrap使用2.3 布局容器(1) container类(2) container-fluid类 3.Bootstrap栅格系统3.1 介绍3.2 栅格选项参数3.3 列嵌套3.4 列偏移3.5 列排序3.6 响应式工具…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…