
C++基础
文章平均质量分 90
x-jeff
AI爱好者
CVer
个人博客网站:https://shichaoxin.com
微信公众号:x-jeff的AI工坊
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++基础】第七十一课:[拷贝控制]交换操作
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-18 20:07:19 · 549 阅读 · 0 评论 -
【C++基础】第七十课:[拷贝控制]拷贝控制和资源管理
对于行为类似指针的类,我们需要为其定义拷贝构造函数和拷贝赋值运算符,来拷贝指针成员本身而不是它指向的string。我们的类仍然需要自己的析构函数来释放接受string参数的构造函数分配的内存。但是,在本例中,析构函数不能单方面地释放关联的string。只有当最后一个指向string的HasPtr销毁时,它才可以释放string。令一个类展现类似指针的行为的最好方法是使用shared_ptr来管理类中的资源。拷贝(或赋值)一个shared_ptr会拷贝(赋值)shared_ptr所指向的指针。原创 2025-08-17 15:03:13 · 1116 阅读 · 0 评论 -
【C++基础】第六十九课:[拷贝控制]拷贝、赋值与销毁
在新标准下,我们可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数(deleted function)来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了它们,但不能以任何方式使用它们。//使用合成的默认构造函数//阻止拷贝//阻止赋值//使用合成的析构函数//其他成员=delete通知编译器(以及代码读者),我们不希望定义这些成员。与=default不同,=delete必须出现在函数第一次声明的时候。原创 2025-08-16 11:44:17 · 1068 阅读 · 0 评论 -
【C++基础】第六十八课:[动态内存]使用标准库:文本查询程序
我们以TextQuery类的定义开始。用户创建此类的对象时会提供一个istream,用来读取输入文件。这个类还提供一个query操作,接受一个string,返回一个QueryResult表示string出现的那些行。设计类的数据成员时,需要考虑与QueryResult对象共享数据的需求。QueryResult类需要共享保存输入文件的vector和保存单词关联的行号的set。原创 2025-08-16 11:39:54 · 564 阅读 · 0 评论 -
【C++基础】第六十七课:[动态内存]动态数组
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-15 21:02:34 · 742 阅读 · 0 评论 -
【C++基础】第六十六课:[动态内存]动态内存与智能指针
现在我们先定义一个管理string的类,此版本命名为StrBlob。实现一个新的集合类型的最简单方法是使用某个标准库容器来管理元素。采用这种方法,我们可以借助标准库类型来管理元素所使用的内存空间。在本例中,我们将使用vector来保存元素。但是,我们不能在一个Blob对象内直接保存vector,因为一个对象的成员在对象销毁时也会被销毁。例如,假定b1和b2是两个Blob对象,共享相同的vector。原创 2025-08-09 11:00:06 · 878 阅读 · 0 评论 -
【C++基础】第六十五课:[关联容器]无序容器
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-09 10:50:24 · 857 阅读 · 0 评论 -
【C++基础】第六十四课:[关联容器]关联容器操作
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-08 21:14:26 · 847 阅读 · 0 评论 -
【C++基础】第六十三课:[关联容器]关联容器概述
关联容器(有序的和无序的)都支持【C++基础】第五十一课:[顺序容器]容器库概览中介绍的普通容器操作(见表9.2)。关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。除了与顺序容器相同的操作之外,关联容器还支持一些顺序容器不支持的操作和类型别名。此外,无序容器还提供一些用来调整哈希性能的操作。关联容器的迭代器都是双向的。原创 2025-08-06 21:11:41 · 1007 阅读 · 0 评论 -
【C++基础】第六十二课:[关联容器]使用关联容器
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-06 21:03:50 · 487 阅读 · 0 评论 -
【C++基础】第六十一课:[泛型算法]特定容器算法
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-02 20:59:42 · 372 阅读 · 0 评论 -
【C++基础】第六十课:[泛型算法]泛型算法结构
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-08-02 20:58:39 · 533 阅读 · 0 评论 -
【C++基础】第五十九课:[泛型算法]再探迭代器
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-28 19:09:57 · 799 阅读 · 0 评论 -
【C++基础】第五十八课:[泛型算法]定制操作
我们可以向一个算法传递任何类别的可调用对象(callable object)。对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用的。即,如果e是一个可调用的表达式,则我们可以编写代码e(args),其中args是一个逗号分隔的一个或多个参数的列表。到目前为止,我们使用过的仅有的两种可调用对象是函数和函数指针。重载了函数调用运算符的类,以及lambda表达式(lambda expression)。一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。原创 2025-07-27 11:41:26 · 657 阅读 · 0 评论 -
【C++基础】第五十七课:[泛型算法]初识泛型算法
一种保证算法有足够元素空间来容纳输出数据的方法是使用插入迭代器(insert iterator)。插入迭代器是一种向容器中添加元素的迭代器。通常情况,当我们通过一个迭代器向容器元素赋值时,值被赋予迭代器指向的元素。而当我们通过一个插入迭代器赋值时,一个与赋值号右侧值相等的元素被添加到容器中。后续博文会详细介绍插入迭代器的内容。但是,为了展示如何用算法向容器写入数据,我们现在将使用,它是定义在头文件iterator中的一个函数。原创 2025-07-26 16:20:50 · 1046 阅读 · 0 评论 -
【C++基础】第五十六课:[泛型算法]概述
标准库容器定义的操作集合惊人得小。标准库并未给每个容器添加大量功能,而是提供了一组算法,这些算法中的大多数都独立于任何特定的容器。这些算法是通用的(generic,或称泛型的):它们可用于不同类型的容器和不同类型的元素。顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素、访问首尾元素、确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器。我们可以想象用户可能还希望做其他很多有用的操作:查找特定元素、替换或删除一个特定值、重排元素顺序等。原创 2025-07-25 20:48:01 · 862 阅读 · 0 评论 -
【C++基础】第五十五课:[顺序容器]容器适配器
每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。//从deq拷贝元素到stk默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。deque是一种顺序容器,是双端队列,在头部尾部都可以进行快速插入/删除。原创 2025-07-25 20:46:35 · 706 阅读 · 0 评论 -
【C++基础】第五十四课:[顺序容器]额外的string操作
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-20 20:40:26 · 805 阅读 · 0 评论 -
【C++基础】第五十三课:[顺序容器]vector对象是如何增长的
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-19 18:56:29 · 568 阅读 · 0 评论 -
【C++基础】第五十二课:[顺序容器]顺序容器操作
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-15 21:53:08 · 852 阅读 · 0 评论 -
【C++基础】第五十一课:[顺序容器]容器库概览
每个容器类型都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创建一个指定类型的空容器,且都可以接受指定容器大小和元素初始值的参数。原创 2025-07-12 20:16:58 · 742 阅读 · 0 评论 -
【C++基础】第五十课:[顺序容器]顺序容器概述
下表列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。向容器添加或从容器中删除元素的代价。非顺序访问容器中元素的代价。除了固定大小的array外,其他容器都提供高效、灵活的内存管理。我们可以添加和删除元素,扩张和收缩容器的大小。容器保存元素的策略对容器操作的效率有着固有的,有时是重大的影响。在某些情况下,存储策略还会影响特定容器是否支持特定操作。例如,string和vector将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。原创 2025-07-12 20:14:46 · 658 阅读 · 0 评论 -
【C++基础】第四十九课:[IO库]string流
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-06 16:27:41 · 401 阅读 · 0 评论 -
【C++基础】第四十八课:[IO库]文件输入输出
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-07-05 16:10:44 · 1096 阅读 · 0 评论 -
【C++基础】第四十七课:[IO库]IO类
C++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO。这些类型支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还有一些类型允许内存IO,即,从string读取数据,向string写入数据。IO库定义了读写内置类型值的操作。此外,一些类,如string,通常也会定义类似的IO操作,来读写自己的对象。istream(输入流)类型,提供输入操作。ostream(输出流)类型,提供输出操作。cin,一个istream对象,从标准输入读取数据。原创 2025-07-05 16:04:55 · 793 阅读 · 0 评论 -
【C++基础】第四十六课:[类]类的静态成员
和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数。自己测试发现上述代码编译出错,我自己测试的结果就是成员函数只有定义在类内时可以直接使用静态成员,定义在类外时不能。因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时被定义的。这意味着它们不是由类的构造函数初始化的。而且一般来说,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一个静态数据成员只能定义一次。类似于全局变量,静态数据成员定义在任何函数之外。原创 2025-07-01 17:24:20 · 847 阅读 · 0 评论 -
【C++基础】第四十五课:[类]构造函数再探
在要求隐式转换的程序上下文中,我们可以通过将构造函数声明为explicitpublic://其他成员与之前的版本一致//错误:string构造函数是explicit的//错误:istream构造函数是explicit的⚠️关键字explicit只对一个实参的构造函数有效。需要多个实参的构造函数不能用于执行隐式转换,所以无须将这些构造函数指定为explicit的。//错误:explicit关键字只允许出现在类内的构造函数声明处。原创 2025-07-01 17:21:51 · 690 阅读 · 0 评论 -
【C++基础】第四十四课:[类]类的作用域
一个类就是一个作用域的事实能够很好地解释为什么当我们在类的外部定义成员函数时必须同时提供类名和函数名。在类的外部,成员的名字被隐藏起来了。一旦遇到了类名,定义的剩余部分就在类的作用域之内了,这里的剩余部分包括参数列表和函数体。结果就是,我们可以直接使用类的其他成员而无须再次授权了。另一方面,函数的返回类型通常出现在函数名之前。因此当成员函数定义在类的外部时,返回类型中使用的名字都位于类的作用域之外。这时,返回类型必须指明它是哪个类的成员。public://向窗口添加一个Screen,返回它的编号。原创 2025-06-29 21:09:40 · 986 阅读 · 0 评论 -
【C++基础】第四十三课:[类]类的其他特性
Screen表示显示器中的一个窗口。每个Screen包含一个用于保存Screen内容的string成员和三个string::size_type类型的成员,它们分别表示光标的位置以及屏幕的高和宽。除了定义数据和函数成员之外,类还可以自定义某种类型在类中的别名。public://等价于:private:用来定义类型的成员必须先定义后使用,这一点与普通成员有所区别。因此,类型成员通常出现在类开始的地方。原创 2025-06-28 16:30:04 · 875 阅读 · 0 评论 -
【C++基础】第四十二课:[类]访问控制与封装
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-06-23 21:25:59 · 795 阅读 · 0 评论 -
【C++基础】第四十一课:[类]定义抽象数据类型
类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是一种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现部分。类要想实现数据抽象和封装,需要首先定义一个。原创 2025-06-22 11:10:22 · 1012 阅读 · 0 评论 -
【C++基础】第四十课:函数指针
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-06-21 12:50:58 · 966 阅读 · 0 评论 -
【C++基础】第三十九课:函数匹配
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-06-06 21:47:04 · 781 阅读 · 0 评论 -
【C++基础】第三十八课:特殊用途语言特性
默认实参,内联函数,constexpr函数,assert,NDEBUG,__func__,__FILE__,__LINE__,__TIME__,__DATE__原创 2025-05-31 16:05:22 · 1024 阅读 · 0 评论 -
【C++基础】第三十七课:函数重载
对于重载的函数来说,它们应该在形参数量或形参类型上有所不同。⚠️不允许两个函数除了返回类型外其他所有的要素都相同。//错误:与上一个函数相比只有返回类型不同。原创 2025-05-25 20:00:52 · 520 阅读 · 0 评论 -
【C++基础】第三十六课:返回类型和return语句
return语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。return;原创 2025-05-12 19:12:36 · 796 阅读 · 0 评论 -
【C++基础】第三十五课:参数传递
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-05-10 17:56:00 · 719 阅读 · 0 评论 -
【C++基础】第三十四课:函数基础
【C++基础】系列博客为参考)一书,自己所做的读书笔记。原创 2025-05-08 22:03:09 · 888 阅读 · 0 评论 -
【C++基础】第三十三课:try语句块和异常处理
异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。throw表达式(throw expression),异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发(raise)了异常。try语句块(try block),异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句(catch clause)结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称作。原创 2025-05-05 21:50:38 · 724 阅读 · 0 评论 -
【C++基础】第三十二课:跳转语句
C++语言提供了4种跳转语句:break、continue、goto和return。return语句后续博客会有介绍,在此不再详述。原创 2025-05-04 13:41:55 · 384 阅读 · 0 评论