C++初阶--C++入门(2)

C++入门(1)链接入口

文章目录

  • 内联函数
  • auto关键字
    • 注意事项
  • 基于范围的for循环(C++11)
  • nullptr

内联函数

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

//内联函数 inline
inline int Add(int x, int y)
{return x + y;
}
//不同建立栈帧,提高函数效率
int main()
{cout << Add(1, 2) << endl;return 0;//内联函数向编译器发送请求,编译器可以忽略这个请求
}

在这里插入图片描述

在这里插入图片描述

在C语言中,我们会用到宏定义#define 处理一些替换,如简单的函数,复杂的数据,变量名;貌似宏定义与内联函数是相同的;

但实际上是有很大的区别的:

内联函数是真实的函数,可以像普通函数一样进行调试、类型调查和自动类型转换。它们可以包含类的成员变量,并且可以在编译阶段将函数嵌入到调用处。而宏定义只是简单的文本替换,不进行类型检查和类型转换,且只是在预编译阶段进行替换,没有任何调错机会,一旦有错误,在编译前就无法实现。

在这里插入图片描述
所以,内联函数不要把声明和定义分离开来,最好就在同一文件下进行。

auto关键字

在C++11中,,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。也就是说,auto可以自动识别类型

初步测试:

int main()
{int a = 10;char b = 2;double c = 2.0;int* d = &a;float e = 1.0;auto a1 = a;auto b1 = b;auto c1 = c;auto d1 = d;auto* d2 = d;auto& d3=d;//auto和auto*是没有什么区别的//auto进行引用时,就必须使用auto&,因为auto是对类型进行判断,引用相当于别名,所以要加auto e1 = e;cout << typeid(a1).name() << endl;cout << typeid(b1).name() << endl;cout << typeid(c1).name() << endl;cout << typeid(d1).name() << endl;cout << typeid(e1).name() << endl;}

在这里插入图片描述

对于目前阶段来说,auto无法体现出真正的价值,但在C++中,定义类型时,有时可不只是一个int或者float可以比的;

#include<string>
#include<vector>int main()
{vector<string> v;vector<string>::iterator it = v.begin();auto it = v.begin();//上下的类型一样//auto在定义对象时,类型较长时,用它很方便
}

注意事项

不可作为参数

void func(auto a)
{//auto不可作为参数,编译器无法对a的实际类型进行推导//传参的内容是拷贝主参的,所以对于函数来说,都是参数值,无法进行类型推导
}

返回值
在VS2022中,已经支持auto作为返回值,但最好还是不要用,作为返回值有一定的风险性,如果没有返回值,或者没有参数,那么对于这个函数的返回值是无的。

//可以作为返回值
auto func(int a)
{return a;
}

同一行多个变量

//同一行多个变量
void Testauto()
{auto a = 1, b = 2;auto c = 1, d = 'd';//错误的//在同一行进行多个变量定义时,必须是类型相同的;因为auto只对第一个变量进行识别判断
}

在这里插入图片描述

不可作为数组

void Testauto()
{int a[] = { 1,2,3 };auto b[] = { 1,2,3 };//错误的//auto不可用来声明数组
}

在这里插入图片描述

基于范围的for循环(C++11)

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

void TestFor2()
{int array[] = {1,2,3,4,5};//引用e取数组中每个值//e取完一个值后,会自动++1cout << array[0] << endl;for (auto& e : array){cout << e << endl;}
}

在这里插入图片描述

void TestFor2()
{int array[] = {1,2,3,4,5};//引用e取数组中每个值//e取完一个值后,会自动++1for (auto& e : array){e *= 2;}cout << array[0] << endl;for (auto& e : array){cout << e << endl;}
}

在这里插入图片描述

由于这种范围for比较方便,相对的,使用这种for循环也有一定的条件要求:
for循环迭代的范围必须是确定的。对于数组而言,就是数组中第一个元素和最后一个元素的范围;
迭代的对象要实现++和==的操作

nullptr

由于在C++中,NULL是这样定义的:
在这里插入图片描述
NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量
我们也可以测试下:

//nullptr
void f(int)
{cout << "f:int" << endl;
}
void f(int*)
{cout << "f:int*" << endl;
}
int main()
{f(0);f(NULL);//结果一样,因为NULL就是0}

在这里插入图片描述
所以就有了nullptr这样的关键字;
在这里插入图片描述
注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

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

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

相关文章

Spring学习笔记(2)

Spring学习笔记&#xff08;2&#xff09; 一、Spring配置非定义Bean1.1 DruidDataSource1.2、Connection1.3、Date1.4、SqlSessionFactory 二、Bean实例化的基本流程2.1 BeanDefinition2.2 单例池和流程总结 三、Spring的bean工厂后处理器3.1 bean工厂后处理器入门3.2、注册Be…

Flutter的Invalid use of a private type in a public API警告

文章目录 问题描述有问题的源码 问题原因解决方法 问题描述 自己在写Flutter 应用时发现了一个Invalid use of a private type in a public API警告。 发现很多官方的例子也有这个问题。 有问题的源码 有问题的源码如下&#xff1a; class MyTabPage extends StatefulWid…

【Linux学习笔记】代码编辑工具vim

1. vim工具基本模式的转换2. vim命令模式下的各种编辑命令2.1. 光标行定位2.2. 光标自由定位2.3. 复制粘贴2.4. 删除2.5. 文本的大小写替换2.6. 文本的替换2.7. 文本的前删后删2.8. 撤销操作 3. vim底行模式下的命令3.1. 设置行号与取消设置行号3.2. 分屏操作3.3. 在不退出vim的…

01、Python 安装 ,Pycharm 安装

目录 安装安装 Python安装 Pycharm 创建项目简单添加文件运行 简单爬取下载小视频 安装 python-3.8.10-amd64.exe – 先安装这个 pycharm-community-2022.2.exe 再安装这个 安装 Python python-3.8.10-amd64.exe 安装&#xff08;这个是其他版本的安装&#xff0c;步骤一样…

ZXing.Net 的Core平台生成二维码

一、引用 二、代码 帮助类 /// <summary>/// ZXing.NET 二维码帮助类/// </summary>public class ZXingHelper{/// <summary>/// 站点二维码的目录/// </summary>private static string QRCodeDirectory "QRCode";/// <summary>/// 使…

MySQL数据库——视图-介绍及基本语法(创建、查询、修改、删除、演示示例)

目录 介绍 语法 创建 查询 修改 删除 演示示例 介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff08;称为基表&#xff09;&#xff0c;并且是在使用视图时动…

爬虫基础 JS逆向

爬虫核心 1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么 &#xff08;1&#xff09;简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;…

SpringBoot+Mybatis实现多数据源+分页

1 主要依赖版本 &#xff08;1&#xff09;SpringBoot 2.7.8 &#xff08;2&#xff09;Mybatis 2.2.2 &#xff08;3&#xff09;Pagehelper 1.3.0 &#xff08;4&#xff09;MySQL 8.0.26 &#xff08;5&#xff09;Oracle 11.2.0.3 2 概述 &#xff08;1&#xff09;…

List集合拆分为多个List

list 拆分 目录概述需求&#xff1a; 设计思路实现思路分析1.list 拆分是2.用stream的parallel实现list的分批处理3.使用stream的parallel实现list的分批处理 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full bus…

[架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

目录 前言&#xff1a; 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合&#xff08;应用程序不用的底层需求&#xff1a;计算、存储、通信&#xff09; 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2…

uniapp(uncloud) 使用生态开发接口详情4(wangeditor 富文本, 云对象, postman 网络请求)

wangeditor 官网: https://www.wangeditor.com/v4/pages/01-%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8/01-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.html 这里用vue2版本,用wangeditor 4 终端命令: npm i wangeditor --save 开始使用 在项目pages > sy_news > add.vue 页面中…

Docker部署Jumpserver堡垒机

Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的专业运维审计系统。 Jumpserver 使用 Python / Django 进行开发&#xff0c;遵循 Web 2.0 规范&#xff0c;配备了业界领先的 Web Terminal 解决方案&#xff0c;交互界面…

优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符

&#x1f974;博主&#xff1a;小猫娃来啦 &#x1f974;文章核心&#xff1a;优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符 文章目录 引言空值处理的挑战解决方案1&#xff1a;?? 运算符基本用法与 || 运算符的区别实际应用场景举例 解决方案2&#xff…

jenkins出错与恢复

如果你的jenkins出现了如下图所示问题&#xff08;比如不能下载插件&#xff0c;无法保存任务等&#xff09;&#xff0c;这个时候就需要重新安装了。 一、卸载干净jenknis 要彻底卸载 Jenkins&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1、停止 Jenkins 服务&…

CCC数字钥匙设计【NFC】--通过NFC进行车主配对Phase3

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase3进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

从零实现FFmpeg6.0+ SDL2播放器

FFmpeg6.0开发环境搭建播放器代码框架分析解复用模块开发实现包队列和帧队列设计音视频解码线程实现SDL2音频声音输出SDL2视频画面渲染-YUV显示音视频同步-基于音频 地址: https://xxetb.xet.tech/s/3NWJGf

【STM32】--基础了解

一、STM32来历背景 1.从51到STM32 &#xff08;1&#xff09;单片机有很多种 &#xff08;2&#xff09;STM32内核使用ARM&#xff0c;但是ARM不一定是STM32 &#xff08;3&#xff09;ATM32是当前主流的32位高性能单片机 &#xff08;4&#xff09;STM32的特点&#xff1a;高…

docker入门加实战—部署Java和前端项目

docker入门加实战—部署Java和前端项目 部署之前&#xff0c;先删除nginx&#xff0c;和自己创建的dd两个容器&#xff1a; docker rm -f nginx dd部署Java项目 作为演示&#xff0c;我们的Java项目比较简单&#xff0c;提供了一个接口&#xff1a; 配置文件连接docker里的m…

03、爬取资料---但是失败,仅作为记录

1、找网址 进入直播间&#xff0c;里面的用户被设置不对外查看。 如图&#xff0c;找url 2、伪装 user-agent 用户代理 cookie 用户登录后保留的信息 登录信息&#xff1a;找cookie 浏览器信息&#xff1a;找user-agent user-agent 用户代理 cookie 用户登录后保留的信…