C++相关概念和易错语法(14)(初始化注意事项、vector、编译器向上查找规则)

1.当我们在代码中想要终止运行的话,我们可以采用Ctrl + C或Ctrl + Z,其中^C代表杀进程,^Z设置结束

2.编码表:我们目前比较熟悉的是ASCII码编码方式,但是我们发现平时使用的汉字无法通过ASCII编码,除此之外,世界上各个国家的文字都需要编码,因此Unicode统一码(万国码)被研发出来了,它针对世界上各个国家的语言采用不同的编码方式,其中最常见的就是UTF-8,它针对不同的语言符号有不同长度的编码,从1个字节到4个字节不等UTF-16编码长度固定为2个字节或4个字节,而UTF-32是以固定长度4个字节的编码来表示语言符号的,它们在存储上要消耗更大的空间,同时也能表示出更多符号,但UTF-8基本上能表示常见的字符了,因此一般使用UTF-8。

在string头文件里我们也可以看到专门针对不同存储方式的string,但是平时几乎不使用,了解即可。

在我们国家,为了进一步表示一些字体,我们自己研发了GBK编码方式,它在某种程度上比UTF-8表示中文更丰富。目前在Windows下大多采用的就是GBK编码。

3.整型家族在static修饰的下可在声明处定义

但注意仅限于整型家族,如flaot、double等都不支持这种写法,都只能声明和定义分离

4.初始化注意事项

由于new初始化方式比较易混,这里总结了一些常见的易混点,正常情况下别乱用

多参数易混点:

单参数易混点:

这里注意,只要开辟空间的形式是数组,那么不管开几个空间,都会遵循数组的初始化规则

在其余初始化场景,也遵循上面的初始化规则

其中有几种写法很易混,最好不要这样去写

可以看到b和d的初始化内部被识别为initializer list,而a和c这样的单参数却不会被识别,要多加注意。

同时注意逗号表达式的()可以嵌套,只要满足上面的初始化规则,就可以这样写

5.vector基本理解

在接触了string之后,我们对每个容器的框架都有了一个基本的认识,因此其余容器的学习就会轻松一些。 

(1)vector相当于我们之前接触过的顺序表,是对连续的数据进行存储,这个数据可以是任意类型,但是不支持int、double等存到同一个vector里,因为vector的实现涉及模板template,需要显式实例化,如果出现多种类型会发生推理冲突。空间配置器是vector模板声明第二个参数,涉及内存池,有缺省值,我们不用太在意。

(2)string和vector<char>差距很大,string可以一次性加入一个串,而vector<char>只能单独加字符,string不管怎么操作,数据最后一定有个\0,而vector尾插不会有这个功能,需要自己去处理\0的情况,很不方便。同时,vector<char>也缺少一些必要的接口,如c_str。

但vector和string很多接口相似,访问都可以用下标+[],迭代器,范围for(本质也是迭代器)

因此我们可知,string是专门针对字符数组的需求设计的,而vector是广泛适应的,vector不能替代string,需要根据不同的场景有不同的选择。

(3)初始化

(4)迭代器和string的没有任何使用区别

(5)访问和string的没有任何使用区别

front和back的返回值和operator[]一样,但注意back返回的不是最后一个元素的下一个位置,而是最后一个元素的位置,这里要和end迭代器做区分

(6)容量相关接口和string的没有任何使用区别

唯一需要注意的是resize和reserve

resize不仅会扩容,还会填充开辟空间的值,注意缺省值

reserve只开辟空间(可能开辟的最终空间比n多),不做任何处理。

注意最好不要缩容,不同编译器会有不同处理方式,比如msvc下,reserve很多情况下不会缩容,resize会缩容,但在g++下,都会缩容。

(7)在有的接口上,vector就和string有不同之处了,主要体现在参数的传递上


我们发现,vector下的接口要简洁很多,多个数据的插入和删除都是通过迭代器来控制的。

6.编译器向上查找规则

当我们调用函数的时候,编译器会从函数调用处向上查找该函数,如果没有相关声明或定义会报错。那么下面这种情况是什么导致的呢?

很多人会认为是因为test.h中没有展开std导致cout和endl不能使用,但是下面这种情况呢?

我们依然需要用向上查找来解释。

.h文件在预处理阶段就会展开,因此.h不存在编译链接的情况,所以根据“.h中没有展开std导致cout和endl不能使用”完全是错误的。在.h展开后,在调用test()时,需要向上查找cout,但是cout是在std命名空间里的,所以需要展开命名空间才能正常访问。

图1展开命名空间的语句在展开头文件的下面,因此在向上查找的情况下,并不会读取using namespace std,也就不会在std命名空间里找,所以找不到。

而图2展开命名空间的语句在展开头文件的上面,因此查找的时候会到std命名空间里找。

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

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

相关文章

1个逗号,提升Python代码质量

有些时候&#xff0c;我们会在Python代码中看到列表或其他科迭代对象的结尾会存在一个逗号&#xff1a; 而且编辑器和解释器都容许这种逗号的存在&#xff0c;它就叫作拖尾逗号。 通常是为了在频繁地增减数组元素的时候同时保证语法的正确&#xff0c;且拖尾逗号不占用数组的长…

气膜建筑:寿命、优势与应用—轻空间

近年来&#xff0c;气膜建筑因其独特的结构和众多优势&#xff0c;逐渐成为建筑领域的热门选择。气膜建筑使用寿命长&#xff0c;且在建造速度、成本、安全性、节能环保和舒适性等方面具有显著优势。轻空间将详细探讨气膜建筑的使用寿命、主要优势及其在不同领域的广泛应用。 气…

【从C++到Java一周速成】章节10:封装、继承、方法的重写、多态

章节10&#xff1a;封装、继承、方法的重写、多态 【1】封装1.高内聚&#xff0c;低耦合2.代码层面的体现 【2】继承【3】方法的重写【4】多态 【1】封装 1.高内聚&#xff0c;低耦合 高内聚&#xff1a;类的内部数据操作细节自己完成&#xff0c;不允许外部干涉&#xff1b;…

JSX语法看这一篇就够了-02

JSX and React 是相互独立的两种开发语言&#xff0c;它们经常一起使用&#xff0c;但也可以单独使用它们中的任意一个&#xff0c;JSX 是JavaScript 语言的扩展&#xff0c;而 React 则是一个 JavaScript 的库。 概述简介 JSX简介 JSX全称 javascriptXML&#xff0c;是Faceb…

cmake编译redis6.0源码总结

1配置clion使用cygwin模拟linux环境&#xff0c;先下载cygwin后配置 2导入源码&#xff0c;配置cmake文件 由于redis是基于Linux上的Makefile&#xff0c;所以Windows上需要配置CMakeLists.txt使用cmake工具编译运行。github上已经有人尝试编写CMakeLists.txt文件&#xff0c…

软件测评的重要性

软件测评的必要性体现在多个方面&#xff0c;以下是其主要原因&#xff1a; 质量保障&#xff1a;软件测评的首要目标是确保软件的质量。通过系统的测试&#xff0c;可以发现软件中的缺陷、错误或不符合需求的地方&#xff0c;从而及时进行修复和改进。这有助于保证软件在实际…

怎么录制直播视频教程?一看就会的方法分享

随着网络直播的兴起&#xff0c;无论是教学、会议还是娱乐&#xff0c;直播视频已成为人们日常生活和工作中不可或缺的一部分。录制直播视频教程不仅可以帮助我们回顾和分享精彩瞬间&#xff0c;还能为观众提供便捷的学习资源。可是怎么录制直播视频教程呢&#xff1f;本文将介…

轻松同步:将照片从三星手机传输到iPad的简便方法

概括 想要在新 iPad 上查看三星照片吗&#xff1f;但是&#xff0c;如果您不知道如何将照片从三星手机传输到 iPad&#xff0c;则无法在 iPad 上查看图片。为此&#xff0c;本文分享了 7 个有用的方法&#xff0c;以便您可以使用它们在不同操作系统之间轻松发送照片。现在&…

炫酷gdb

在VS里面调试很方便对吧&#xff1f;&#xff08;F5直接调试&#xff0c;F10逐过程调试--不进函数&#xff0c;F11逐语句调试--进函数&#xff0c;F9创建断点&#xff09;&#xff0c;那在Linux中怎么调试呢&#xff1f; 我们需要用到一个工具&#xff1a;gdb 我们知道VS中程…

ARM-2

c语言实现三盏灯的控制 #ifndef __LED_H__ #define __LED_H__typedef struct {volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDER;volatile unsigned int PUPDR;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsig…

问题与解决:element ui垂直菜单展开后显示不全

比如我这个垂直菜单展开后&#xff0c;其实系统管理下面还有其他子菜单&#xff0c;但是显示不出来了。 解决方法很简单&#xff0c;只需要在菜单外面包一层el-scrollbar&#xff0c;并且将高度设置为100vh。

【计算机视觉(2)】

基于Python的OpenCV基础入门——视频的处理 视频OpenCV视频处理操作&#xff1a;创建视频对象判断视频是否成功初始化读取视频帧获取视频特征设置视频参数声明编码器保存视频释放视频对象 视频处理基本操作的代码实现&#xff1a; 视频 视频是由一系列连续的图像帧组成的。每一…

Java学习【接口的使用实例,浅克隆与深克隆】

Java学习【接口的使用实例&#xff0c;浅拷贝与深拷贝】 Comparable接口String类型比较多个对象的比较 Comparator接口Cloneable接口浅拷贝深拷贝 Comparable接口 当我们想要比较两个基本数据类型的大小时直接用 > , < , 就可以了&#xff0c;那么如果是自定义的类要根…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述&#xff1a;随机输入浮点数&#xff0c;输出四舍五入后的整数…

MySQL 主备环境搭建 docker

MySQL 主备环境搭建 docker 拉取docker镜像 sudo docker pull mysql:8.0 启动容器 docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0配置 M…

vue.js对接海康威视摄像头web开发包

一、登录海康开放平台下载web开发包&#xff0c;下载需要先登录海康账号&#xff0c;没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…

【论文速读】|探索ChatGPT在软件安全应用中的局限性

本次分享论文&#xff1a;Exploring the Limits of ChatGPT in Software Security Applications 基本信息 原文作者&#xff1a;Fangzhou Wu, Qingzhao Zhang, Ati Priya Bajaj, Tiffany Bao, Ning Zhang, Ruoyu "Fish" Wang, Chaowei Xiao 作者单位&#xff1a;威…

与优秀者同行,“复制经验”是成功的最快捷径

富在术数不在劳身&#xff0c;利在局势不在力耕。我们始终相信&#xff0c;与优秀者同行&#xff0c;“复制经验”才是走向成功的最快“捷径”! 酷雷曼合作商交流会 作为酷雷曼合作商帮扶体系里的重要一环&#xff0c;合作商交流会是总部专门为合作商们搭建的一个博采众长、相…

基于svm的水果识别

1、程序界面介绍 该程序GUI界面包括待检测水果图片加载、检测结果输出、清空可视化框等。其中包括训练模型、加载图片、重置、识别检测按钮。 程序GUI界面 识别玉米识别西瓜 分类器识别水果基本原理&#xff1a; 由于每种水果的外形存在很大差异&#xff0c;比如西瓜与玉米&…

【class14】创建自己的OCR系统

【class14】 上节回顾 在上节课中&#xff0c;我们主要了解了OCR的实现原理。 简单来说&#xff0c;OCR技术就是提取文档/图像中的文字。 接下来我们将进入实战&#xff0c;搭建属于自己的OCR系统&#xff5e;为了更高效地学习&#xff0c;我们分为以下几步完成&#xff1a;…