![](https://img-blog.csdnimg.cn/c1891f7c52a44f29b075973aebb4f2f1.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++基础知识精讲
文章平均质量分 85
深入讲解C++方面的基础知识,帮你理解透彻,灵活运用,适合有一定C/C++基础的程序员阅读
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
希望_睿智
中国科学技术大学毕业,专注于安防监控行业近二十年。在安防监控客户端、安防监控运营级平台、Web开发、嵌入式开发、深度学习、人工智能、音视频编解码、图像处理、流媒体等多个领域具备实战开发经验和技术积累,共发表发明专利十余项,软件著作权几十项。商务合作和推广,可私信联系。
展开
-
《C++基础知识精讲》专栏介绍
本专栏深入讲解C++方面的基础知识,帮你理解透彻,灵活运用,适合有一定C/C++基础的程序员阅读。原创 2023-04-02 20:19:36 · 1729 阅读 · 26 评论 -
1 宏的使用大全
宏,也叫宏定义,并不是C/C++语言本身的一部分,不能直接对宏进行编译。在编译程序前,必须先对宏进行预先的处理(专业术语叫作“预处理”)。预处理器会分析所有的源文件,当遇到宏名称严格匹配时,就会展开宏,也就是用定义好的文本来代替宏名称。宏的用途主要有三点:一是可以为程序员的开发提供一定的便利性;二是可以有效减少源文件中大量重复的、相似的代码;三是可以在一定程度上减少系统的开销,提高程序的运行效率。C/C++语言预定义了一些宏定义,常用的宏定义如下表。宏名称数据类型备注__FILE__字符串。原创 2023-02-08 08:17:36 · 2248 阅读 · 10 评论 -
2 结构体的使用
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也是C++编程开发中比较重要的知识点。下面将介绍结构体的使用,主要包括三方面的内容:一是结构体变量初始化,二是结构体变量赋值,三是结构体字节对齐。原创 2023-02-02 14:15:20 · 601 阅读 · 7 评论 -
3 使用指针的7大陷阱
C语言之父丹尼斯·里奇曾说过:“C语言诡异离奇,陷阱重重,却获得了巨大成功!”这句话一方面体现了C语言的灵活性以及广泛的使用,另一方面也体现了C语言的复杂性。在使用C/C++遇到的所有陷阱和问题中,和指针相关的占了绝大部分。C/C++是灵活度和自由度较大的编程语言,指针更是让程序员可以越过安全的栅栏,对某些内存区域进行破坏性的访问,从而引发安全风险和严重问题。C/C++的指针是一把双刃剑,为我们带来了巨大的灵活性,但使用不当的话,也会带来各种各样的问题。原创 2023-02-03 12:06:03 · 901 阅读 · 11 评论 -
4 使用sizeof的8大注意事项
sizeof是C/C++语言中的关键字,用于计算变量或者数据类型占用的字节数,返回一个size_t类型的无符号整数。sizeof计算变量占用的字节数时,有两种写法:一种是sizeof(变量),用括号把变量包起来,另一种是sizeof 变量,用空白符进行分隔。sizeof计算数据类型占用的字节数时,只有一种写法:sizeof(数据类型)。sizeof虽然很简单,但使用中还是有一些“坑”和“陷阱”需要我们主动去规避。下面将从8个方面介绍使用sizeof的注意事项。原创 2023-02-09 08:21:13 · 664 阅读 · 21 评论 -
5 使用默认参数的4大要点
默认参数是C++中新增的特性。在C++中,可以为函数的参数指定默认值。调用函数时,如果没有指定实参,则自动使用默认参数。默认参数的基本语法这里就不作介绍了,下面重点介绍使用默认参数的一些知识要点。原创 2023-02-18 18:21:13 · 1153 阅读 · 58 评论 -
6 使用强制类型转换的注意事项
在C语言中,强制类型转换是通过直接转换为特定类型的方式来实现的,类似于下面的代码。// C语言的强制类型转换这种方式可以在任意两个类型间进行转换,太过随意和武断,很容易带来一些难以发现的隐患和问题。C++为了向下兼容,保留了这种方式,但新增了四个用于强制类型转换的关键字,分别是:const_cast和。下面逐一介绍这四个关键字的使用场景和注意事项。原创 2023-04-02 20:00:58 · 1116 阅读 · 21 评论 -
7 重载自增和自减运算符
运算符重载实际上是一种特殊形式的C++多态。重载运算符时,需要用到被称为运算符函数的特殊函数形式。运算符函数的函数名比较特殊,可以认为是operator关键字和运算符的组合。运算符函数也是一个函数,具有形参和返回值。运算符函数的定义如下:返回类型 operator 运算符符号(参数列表)函数体。原创 2023-02-05 08:33:00 · 516 阅读 · 10 评论 -
8 placement new的使用
第三种形式的operator new就是我们介绍的placement new,它不分配内存空间,而是借用ptr指针所指向的内存空间调用构造函数构造一个对象,最后返回ptr指针。需要额外注意的是,如果使用placement new时构造的是一个类对象,则释放指针前,需要手动调用类对象的析构函数。回到文章开始提到的第二行语句,其作用为:取整型变量a的地址作为ptr,在整型变量a指向的内存空间构造一个新的整型数据88。阅读完上面的内容后,想必聪明的你已经弄懂了placement new的相关知识。原创 2023-02-06 09:56:22 · 550 阅读 · 4 评论 -
9 构造函数的使用大全
在C++中创建一个对象时,通常需要做一些数据初始化的工作,因此便提供了一个特殊的成员函数 —— 构造函数。一般情况下,并不需要程序员主动调用构造函数,而是在创建对象时,由系统自动调用。构造函数可以由程序员定义,如果未定义,则编译器会提供默认的构造函数。构造函数没有返回值,也不需要加void类型声明,且其名称必须与类名相同。原创 2023-02-24 12:47:06 · 1133 阅读 · 68 评论 -
10 使用继承与派生的6大要点
面向对象编程技术非常看重软件的可重用性,在C++中,可重用性是通过继承机制来实现的。继承机制允许程序员在保持原有类的数据和功能的基础上进行扩展,增加新的数据和功能,从而构成一个新的类,也称为派生类。原有类,一般称之为基类。派生类不仅拥有基类的成员,还拥有自身新增加的成员。继承与派生是C++的重要组成部分,也是C++的基础知识。掌握好了继承与派生,就对面向对象编程技术有了更深刻的理解。关于继承与派生的入门知识,这里就不赘述了,下面将介绍继承与派生相关的一些知识要点。原创 2023-02-13 13:29:32 · 1851 阅读 · 68 评论 -
11 友元函数的使用大全
我们知道,C++的类具有封装和信息隐藏的特性。一般情况下,我们会封装public的成员函数供用户调用,而将成员变量设置为private或protected。但在一些比较复杂的业务情况下,可能需要去访问对象中大量的private或protected成员变量。如果为这些private或protected成员变量都封装public成员函数,无疑是比较麻烦的,有时候还会影响程序的执行效率。此时,友元函数就派上了用场。这就好比我们的房间安装了一个指纹锁,陌生人是无法进入房间内部的。原创 2023-03-10 08:41:53 · 2310 阅读 · 55 评论 -
12 命名空间的使用大全
在C++中,我们会使用变量、常量、函数、类、对象、结构体等各种元素。随着工程越来越庞大,代表这些元素的标识符冲突的概率也越来越大。为了解决标识符命名冲突的问题,C++标准在1995年引入了关键字namespace,也叫做命名空间。使用命名空间后,标识符会归属于不同的空间,即使重名了,一般情况下也不会发生冲突。原创 2023-02-27 12:57:22 · 1667 阅读 · 58 评论 -
13 异常处理的使用大全
异常是指程序在执行的过程中,没有按照预定的流程和逻辑去运行,从而导致数组越界、内存溢出、甚至程序崩溃等各种非正常的情况。在C++、Java和C#等高级语言中,都提供了对于异常的处理机制。异常处理,实际上是一种转移程序控制权的方式。当程序中抛出了异常时,我们可以捕获异常,进而进行相应的处理。处理模型一般有两种:一种是终止模型,表示该异常是致命的,无法恢复,会直接终止程序;另一种是恢复模型,表示该异常是临时的,可恢复的,会尝试去修正错误,确保程序可以继续运行。原创 2023-03-19 12:00:33 · 869 阅读 · 37 评论 -
14 模板的使用大全
在C++中,有两种特别重要的编程思想。一种是我们熟知的面向对象编程,另一种是泛型编程。所谓泛型编程,就是以一种不依赖任何特定数据类型的方式编写代码。在C++ STL标准库中,有许多泛型编程的例子,像vector、list、map等,都用到了泛型编程。模板是泛型编程的基础,它使用参数化的类型来创建函数和类,分别对应函数模板和类模板。通过模板,可以实现数据类型的多态化,可以编写支持多种数据类型的函数和类,大大提高了代码的复用性。原创 2023-03-27 13:27:23 · 710 阅读 · 36 评论 -
15 标准模板库STL之简介
STL采用了泛型化程序设计的思想,使用了C++类模板和函数模板的机制,主要由三大部分组成,分别为:容器、算法和迭代器。STL的一个重要特点是将数据和操作分离,数据由容器进行管理,操作由算法进行控制,迭代器则在两者之间充当粘合剂,使任何算法都可以与任何容器相互协作。迭代器提供了访问容器中元素的方法,每一种容器都提供了自己的迭代器,而这些迭代器向外界隐藏了容器的内部结构。可变序列算法:可以修改其所操作的容器内容的算法,比如:复制容器元素、交换两个容器的内容。iterator,正向迭代器,用于正向遍历容器。原创 2023-04-15 11:10:36 · 780 阅读 · 27 评论 -
16 标准模板库STL之vector
2、vector拥有的内存空间是连续的,因此它能非常好的支持随机存取,在尾部添加、移除元素非常快,但在中间和头部插入、移除元素会造成内存的拷贝,效率比较低。初始化vector主要有8种方式,分别为:默认构造函数初始化、拷贝构造函数初始化、迭代器构造函数初始化、数组地址构造函数初始化、批量赋值构造函数初始化、列表构造函数初始化、insert函数初始化、copy函数初始化。从vector中移除元素,主要有3种方式,分别为:移除指定位置的单个元素、移除指定区间的多个元素、移除满足特定条件的所有元素。原创 2023-04-09 13:29:50 · 1308 阅读 · 53 评论 -
17 标准模板库STL之list
初始化list主要有8种方式,分别为:默认构造函数初始化、拷贝构造函数初始化、迭代器构造函数初始化、数组地址构造函数初始化、批量赋值构造函数初始化、列表构造函数初始化、insert函数初始化、copy函数初始化。从list中移除元素,主要有4种方式,分别为:移除指定位置的单个元素、移除指定区间的多个元素、移除满足特定条件的所有元素、移除指定值的所有元素。向list中插入元素,主要有5种方式,分别为:插入单个元素、插入多个相同元素、插入迭代器区间、插入数组地址、插入列表。原创 2023-04-16 19:02:41 · 939 阅读 · 21 评论 -
18 标准模板库STL之deque
初始化deque主要有8种方式,分别为:默认构造函数初始化、拷贝构造函数初始化、迭代器构造函数初始化、数组地址构造函数初始化、批量赋值构造函数初始化、列表构造函数初始化、insert函数初始化、copy函数初始化。从deque中移除元素,主要有3种方式,分别为:移除指定位置的单个元素、移除指定区间的多个元素、移除满足特定条件的所有元素。向deque中插入元素,主要有5种方式,分别为:插入单个元素、插入多个相同元素、插入迭代器区间、插入数组地址、插入列表。3、使用deque前,需要先包含其头文件。原创 2023-04-16 19:05:56 · 1180 阅读 · 36 评论 -
19 标准模板库STL之set和multiset
2、向set/multiset中插入元素时,set/multiset会自动按升序进行排列,不能在set/multiset的指定位置插入元素。3、set/multiset支持lower_bound、upper_bound、equal_range函数,分别用于查找小于等于指定值的迭代器、大于指定值的迭代器、大于等于指定值和大于指定值的迭代器pair。从set/multiset中移除元素,主要有3种方式,分别为:移除指定位置的单个元素、移除指定区间的多个元素、移除指定值的所有元素。原创 2023-04-22 12:30:12 · 1149 阅读 · 45 评论 -
20 标准模板库STL之map和multimap
2、向map/multimap中插入元素时,map/multimap会自动按升序进行排列,不能在map/multimap的指定位置插入元素。3、map/multimap支持lower_bound、upper_bound、equal_range函数,分别用于查找小于等于指定键的迭代器、大于指定键的迭代器、大于等于指定键和大于指定键的迭代器pair。从map/multimap中移除元素,主要有4种方式,分别为:移除指定位置的单个元素、移除指定区间的多个元素、移除指定值的所有元素、移除满足特定条件的所有元素。原创 2023-05-03 20:21:11 · 1146 阅读 · 31 评论 -
21 标准模板库STL之string
从严格意义上来说,string并不是STL中的容器,但它与容器有很多类似的接口和操作。string是STL中的一个类,对char *或char[]类型的字符串进行了封装。使用string后,不需要再考虑内存是否足够、内存是否未释放、内存越界等问题。除此之外,string还提供了一系列函数,便于我们对字符串进行各种操作。原创 2023-05-13 14:50:16 · 699 阅读 · 26 评论 -
22 标准模板库STL之容器适配器
提到适配器,我们的第一印象是想到设计模式中的适配器模式:将一个类的接口转化为另一个类的接口,使原本不兼容而不能合作的两个类,可以一起工作。STL中的容器适配器与此类似,是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能和接口。之所以将其称为容器适配器,是因为它通过适配已有容器现有的接口来提供不同的功能和接口。STL中的容器适配器包括:stack、queue和priority_queue,下面分别进行介绍。原创 2023-05-14 16:06:24 · 1067 阅读 · 50 评论 -
23 标准模板库STL之迭代器
迭代器作为STL中的三大组件之一,是容器和算法的粘合剂。迭代器提供了访问容器中元素的方法,每一种容器都提供了自己的迭代器,而这些迭代器向外界隐藏了容器的内部结构。算法使用迭代器访问容器中的元素,不需要关心容器的内部结构。STL中的迭代器按照功能主要分为以下5种,分别为:InputIterator:输入迭代器,支持对容器元素的逐个遍历和读取。OutputIterator:输出迭代器,支持对容器元素的逐个遍历和写入。ForwardIterator:前向迭代器,支持向前逐个遍历元素,可以对元素进行读取;原创 2023-05-18 06:47:09 · 1543 阅读 · 50 评论 -
24 标准模板库STL之算法1
算法是STL中用来处理容器中数据的一系列模板函数,可以对数据集合进行查找、排序、拷贝等操作。通过使用迭代器,算法可以运用在任意容器之上,做到与操作的数据的类型和结构无关。STL算法博大精深,涵盖范围非常之广,一共提供了大约100个算法相关的模板函数。这些模板函数涉及的算法主要分为四类,分别为:非可变序列算法:不直接修改其所操作的容器内容的算法,比如:计算相同元素的个数、查找相邻的重复元素。可变序列算法:可以修改其所操作的容器内容的算法,比如:复制容器元素、交换两个容器的内容。排序算法。原创 2023-05-21 09:19:10 · 810 阅读 · 21 评论 -
25 标准模板库STL之算法2
常用的集合算法可参看下表。需要注意的是,这些算法生效有一个前提条件:所有的序列必须是有序的。“移除”序列中所有相邻的重复元素(仅保留一个),返回去重后不重复序列的最后一个迭代器的下一个迭代器。搜索算法的具体使用,可参看下面的示例代码。移除算法的具体使用,可参看下面的示例代码。替换算法的具体使用,可参看下面的示例代码。反转算法的具体使用,可参看下面的示例代码。交换算法的具体使用,可参看下面的示例代码。去重算法的具体使用,可参看下面的示例代码。集合算法的具体使用,可参看下面的示例代码。原创 2023-05-21 09:23:55 · 736 阅读 · 35 评论