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.rhkb.cn/news/164123.html

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

相关文章

ND协议——无状态地址自动配置 (SLAAC)

参考学习&#xff1a;计算机网络 | 思科网络 | 无状态地址自动配置 (SLAAC) | 什么是SLAAC_瘦弱的皮卡丘的博客-CSDN博客 与 IPv4 类似&#xff0c;可以手动或动态配置 IPv6 全局单播地址。但是&#xff0c;动态分配 IPv6 全局单播地址有两种方法&#xff1a; 如图所示&#…

『C++ - STL』之优先级队列( priority_queue )

文章目录 前言优先级队列的结构优先级队列的模拟实现仿函数 最终代码 前言 什么是优先级队列&#xff0c;从该名中可以知道他一定有队列的一定属性&#xff0c;即先入先出(LILO)&#xff0c;而这里的优先级则可以判断出它的另一个特点就是可以按照一定的条件将符合该条件的先进…

移动设备管理对企业IT 安全的增强

移动设备管理 &#xff08;MDM&#xff09; 是通过定义策略和部署安全控制&#xff08;如移动应用程序管理、移动内容管理和条件 Exchange 访问&#xff09;来管理移动设备的过程。 完整的MDM解决方案可以管理在Android&#xff0c;iOS&#xff0c;Windows&#xff0c;macOS&a…

【论文解读】单目3D目标检测 DD3D(ICCV 2021)

本文分享单目3D目标检测&#xff0c;DD3D 模型的论文解读&#xff0c;了解它的设计思路&#xff0c;论文核心观点&#xff0c;模型结构&#xff0c;以及效果和性能。 一、DD3D简介 DD3D是一种端到端、单阶段的单目3D目标检测方法&#xff0c;它在训练时用到了点云数据&#xf…

索引失效的几种情况

目录 数据准备&#xff1a; 1、查询条件中有or&#xff0c;索引会失效&#xff1b; 2、like查询以%开头 3、如果类型为字符串&#xff0c;查询条件中数据需用引号引起来&#xff0c;否则不走索引&#xff1b; 4、索引列上参与计算会导致索引失效 5、违背最左匹配原则 6、…

[Hive] explode

在 Hive 中&#xff0c;explode 函数用于将数组&#xff08;Array&#xff09;或者Map类型的列拆分成多行&#xff0c; 每个元素或键值对为一行。这允许我们在查询中对数组或 Map 进行扁平化操作。 下面是使用 explode 函数的示例&#xff1a; 假设我们有一个包含数组字段的表…

面试知识点--基础篇

文章目录 前言一、排序1. 冒泡排序2. 选择排序3. 插入排序4. 快速单边循环排序5. 快速双边循环排序6. 二分查找 二、集合1.List2.Map 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、排序 1. 冒泡排序 冒泡排序就是把小的元素往前调或者把大…

flutter 创建插件

资料&#xff1a; flutter与原生通信的方式简介 - 简书 完整流程 Flutter 集成 Golang 多语言跨端开发基础案例 - 知乎 https://www.cnblogs.com/webabcd/p/flutter_lib_plugin_plugin_ios.html 步骤1、创建插件 我创建的插件名字是konnect_im_sdk 选择的语言是 java和swi…

22款奔驰S400L升级原厂360全景影像 倒车更加的安全

您是否经历过这种场面呢&#xff1f; 停车位&#xff0c;狭窄障碍停车困难 避免盲区&#xff0c;倒车盲区危及生命安全 狭窄路段&#xff0c;无法判断是否安全通过 视角盲区&#xff0c;小孩站在视野盲区看不到&#xff0c;Xjh15863 360度无缝3D全车可见&#xff0c;解决各…

uniapp开发多端应用项目时的常见跨端兼容处理

一、跨端兼容 每个端有每个端的特点&#xff0c;有的能被抹平&#xff0c;有的不可能被抹平。 跨端&#xff0c;不是把web的习惯迁移到全平台。而是按照uni的写法&#xff0c;然后全平台使用。 按照uniapp规范开发可以保证多平台兼容&#xff0c;但每个平台有自己的一些特性。…

02、MySQL-------主从复制

目录 七、MySql主从复制启动主从复制&#xff1a;原理&#xff1a;实现&#xff1a;1、创建节点2、创建数据库3、主从配置1、主节点2、从节点 4、测试&#xff1a;5、问题&#xff1a;1、uuid修改2、service_id3、读写不同步方法1&#xff1a;方法2&#xff1a; 七、MySql主从复…

【VR】【Unity】如何调整Quest2的隐藏系统时间日期

【背景】 网络虽然OK&#xff0c;但是Oculus Quest要连上商店还必须调整好系统时间&#xff0c;不过在Quest系统中&#xff0c;时间对用户是不可见的&#xff0c;本篇介绍调整的方法。 【方法】 打开SideQuest&#xff0c;没有的话先去下载一个。打开后先登录&#xff0c;如…

该方法仅能传入 lambda 表达式产生的合成类

说明&#xff1a;使用Mybatis-plus查询记录时&#xff0c;出现下面的错误&#xff1b; org.apache.ibatis.builder.BuilderException: Error evaluating expression ew.sqlSegment ! null and ew.sqlSegment ! and ew.nonEmptyOfWhere. Cause: org.apache.ibatis.ognl.OgnlEx…

TikTok Shop美国本土店VS跨境店,如何选择?有何区别?

TikTok不仅仅是一个用于分享有趣短视频的平台&#xff0c;它也逐渐成为了商家们极力推广自己品牌和产品的场所。 在TikTok的商业生态系统中&#xff0c;存在几种不同的商店类型&#xff0c;各有其独特性和适用场景。今天&#xff0c;我们就来深入探讨这些店的差异与特点。 一、…

基于Python的车牌识别系统实现

目录 一、图像预处理 二、车牌区域定位 三、字符分割 四、字符识别 五、代码总结 随着人工智能和计算机视觉的不断发展&#xff0c;车牌识别系统成为了智能交通领域中的重要研究方向。Python作为一种流行的编程语言&#xff0c;具有易学易用、开发效率高等优点&#xff0c…

Unity 镜面反射

放置地板和模型 首先&#xff0c;让我们放置地板和将放置在其上的 3D 模型。这次&#xff0c;我使用 Plane 作为地板。从层次视图中选择“创建”→“3D 对象”→“平面”。我们还在地板上放置了 Unity-chan、Cube 和 Sphere。 接下来&#xff0c;创建地板的材质。在项目视图中…

01、MySQL-------性能优化

目录 一、影响性能的相关因素存储过程&#xff1a; 二、sql优化1>、Mysql系统架构2>、引擎区别&#xff1a; 3>、索引1、什么是索引&#xff1f;联合主键索引理解&#xff1a;索引长度理解&#xff1a;什么是慢查询&#xff1f; 1&#xff09;、索引理解2&#xff09;…

MSQL系列(六) Mysql实战-SQL语句优化

Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;以及索引最左侧匹配原则&#xff0c;Explain的用法&#xff0c;可以看到是否使用了索引&#xff0c;今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…

【Docker】Docker网络及容器间通信详解

目录 背景 默认网络 1、bridge 网络模式 2、host 网络模式 3、none 网络模式 4、container 网络模式 自定义网络 容器间网络通信 IP通信 Docker DNS server Joined容器 前言 本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间…

hue实现对hiveserver2 的负载均衡

如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中&#xff0c;进入HDFS Service 进入Instances标签页面&#xff0c;点击Add Role Instances按钮&#xff0c;如下图所示 点击Continue按钮&#xff0c;如下图所示 返回Instances页面&#xff0c;选择HttpFS角色…