【C++的奇迹之旅】
文章平均质量分 96
C++是一种通用的、面向对象的编程语言,广泛应用于游戏开发、图形图像处理、系统软件开发等领域。本分类专栏将以入门到精通的顺序,系统地介绍C++语言的基础知识。
阿森要自信
写是为了更好的思考!阿森讲C/C++,专注于分享编程技巧和经验,让代码走进生活,欢迎关注我的博客,一起努力,一起探索编程的乐趣!
展开
-
C++奇迹之旅:快速上手Priority_queue的使用与模拟实现
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中,位于顶部的元素)优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从特定容器的尾部弹出,其称为优先队列的顶部。底层容器可以是任意标准容器类模版,也可以是其他特定设计的容器类。原创 2024-09-13 09:08:29 · 1063 阅读 · 40 评论 -
C++奇迹之旅:快速上手Stack和Queue的使用与模拟实现
stack官网文档链接:https://legacy.cplusplus.com/reference/stack/stack/?kw=stackstack是一种容器适配器,专门用在具有后进先出的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被发现的,容器适配器就是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将其特定类作为最底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模版或者一些其他特定的容器类原创 2024-09-12 15:17:04 · 1204 阅读 · 12 评论 -
C++奇迹之旅:列表初始化和std::initializer_list(C++11第一篇)
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2024-09-02 00:01:56 · 1305 阅读 · 1 评论 -
C++奇迹之旅:深度解析list的模拟实现
我们先建立一个列表里的节点类listnode// 这个宏定义用于禁用编译器的安全警告。1// 定义一个模板结构 listnode,代表链表中的节点// 指向前一个节点的指针// 指向下一个节点的指针// 节点中存储的数据T _data;// 构造函数,初始化链表节点: _prev(nullptr) // 前一个节点指针初始化为 nullptr, _next(nullptr) // 下一个节点指针初始化为 nullptr。原创 2024-08-31 23:52:32 · 1288 阅读 · 2 评论 -
C++奇迹之旅:双向链表容器list的灵活使用技巧
kw=liststd::list是 C++ 标准库中的一个序列容器,它实现了双向链表(doubly linked list)。列表是序列容器,允许在序列中的任何位置进行常数时间的插入和删除操作,并且支持双向遍历。列表容器实现为双向链表;双向链表可以将它们包含的每个元素存储在不同且无关的存储位置。元素的顺序通过每个元素与前一个元素和下一个元素之间的链接来保持。list与非常相似:主要区别在于对象是单向链表,因此只能向前遍历,而以此换取更小的内存占用和更高的效率。原创 2024-08-23 23:34:09 · 953 阅读 · 2 评论 -
C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
我们先定义自己的命名空间俩封装自定义的类,这样可以避免与标准库中的 发生命名冲突。随即,我们定义模版类,三个成员变量都是迭代器,而迭代器又是原生指针,所以我们将指针取别名为框架代码:理解代码并添加注释如下:成员变量的的私有数据成员:缺省值初始化3.或者我们也可以偷个懒,让编译器自己生成🌉vector(const vector& v)这个构造函数是 类的拷贝构造函数,用于创建一个新的 对象,它是现有 对象的拷贝。这是一个拷贝构造函数,它接受一个 引用类型的 对象 作为参数原创 2024-08-17 20:52:28 · 1135 阅读 · 0 评论 -
“突破 C++ 模板界限:提升代码复用性和可维护性“
前面我们学习了初阶模版,本节我们将学习模版进阶分离编译(Separate Compilation)是编译过程的一种模式,它允许将一个大型程序拆分成多个较小的、独立的编译单元,每个单元分别编译成目标文件(通常是 .obj 或 .o 文件),最后再通过链接器将这些目标文件组合成一个单一的执行文件。首先是头文件public:然后是源文件最后是主程序文件main.cpp,它使用了Calculatorint a = 10;int b = 5;return 0;在C和C++原创 2024-07-14 19:02:28 · 939 阅读 · 8 评论 -
C++奇迹之旅:vector使用方法以及操作技巧
C++ 标准库中的是一个动态数组容器,能够存储并管理元素的集合。它提供了动态调整大小的能力,并且在底层维护一个连续的存储区域,使得元素可以通过索引进行快速访问。模板参数T:向量中存储的元素的类型。Allocator:用于分配内存的分配器类型,默认是。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。在内部,向量使用动态分配的数组来存储其元素。原创 2024-05-22 17:33:25 · 1311 阅读 · 6 评论 -
string的模拟全实现
前面我们学习了string的用法,本节我们将实现string的模拟实现,话不多说,直接上手,因此我们先了解我们是多文件进行编写,因此需要注意命名空间的控制,这是文件分布图:OK,我们开始~原创 2024-05-14 23:59:17 · 1423 阅读 · 8 评论 -
C++奇迹之旅:string类对象的修改操作
网址查询:https://legacy.cplusplus.com/reference/string/string/将字符 追加到字符串的末尾,将其长度增加 。综合其用法:用法:通过在当前值的末尾附加其他字符来扩展字符串:可以追加这string对象,字符串,字符例子:例如:在字符串中指定位置插入其他字符功能:擦除部分字符串,减少其长度:三种擦除:顺序擦除,指定擦除,范围擦除功能:用新内容替换字符串中从字符 开始并跨越 字符的部分(或字符串在 之间的部分):详细可查看原创 2024-05-06 08:00:00 · 2574 阅读 · 11 评论 -
C++奇迹之旅:string类对象的遍历和修改
作用:返回对字符串中位置 处的字符的引用。 是 C++ 标准库中 类的一个成员函数操作符重载。它用于访问 对象中的单个字符。possize_tstring.size() - 1posoperator[]`的定义大致如下,能自动检查非 版本返回一个对字符的引用,可以用来修改字符。实战例子:2. 该 版本返回一个对字符的常量引用,只能用来读取字符。只读不能修改实例: 是 标准库中 类的一种迭代器类型。它允许你遍历和访问 对象中的字符。>返回指向字符串第一个字符的迭代器。原创 2024-05-06 08:00:00 · 957 阅读 · 0 评论 -
C++奇迹之旅:string类对象的容量操作
之所以 的值是 ,是因为 标准库在创建字符串时会分配一些额外的内存空间来应对未来可能的字符串增长。这个额外的内存空间被称为 “预留空间”。字符串 有 个字符,但是 标准库在创建这个字符串时会分配 个字符的内存空间。这样可以避免频繁的内存重新分配操作,提高性能,所以 的值是 。擦除字符串的内容,该字符串将变为空字符串,长度为,但是存储空间没有改变如果字符串长度为 ,则为 ,否则为 。当你需要向字符串中添加大量字符时,使用 函数可以避免频繁的内存分配和拷贝操作,从而提高程序的性能。可以原创 2024-05-06 08:00:00 · 1302 阅读 · 0 评论 -
C++奇迹之旅:string类接口详解(上)
string():构造空的string类对象,即空字符串--> 用C-string来构造string类对象----> 拷贝构造---->复制从字符位置pos开始向后len长度的str部分—>从s指向的字符数组中复制前n个字符。—>用字符c的n个连续副本填充字符串。原创 2024-05-05 08:00:00 · 1707 阅读 · 4 评论 -
C++奇迹之旅:C++初阶模版
class 类模板名// 类内成员定义public:Stack(): top(-1){}T pop()private:int top;模版Stack中只是提供了一个模具,具体印刷出什么模型,是由编译器最终实例化决定的,这里的模版不是最终版注意:模版不建议声明和定义分离到.h和.cpp会出现链接错误,要分离也分离在.h// 扩容//++_size;原创 2024-05-04 08:00:00 · 1378 阅读 · 5 评论 -
C++奇迹之旅:C++内存管理的机制(终篇)
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题。原创 2024-05-04 08:00:00 · 611 阅读 · 2 评论 -
C++奇迹之旅:C++内存管理的机制(进阶篇)
我们先看malloc与free,调试可以发现并不会调用析构函数class Apublic:: _a(a)~A()private:int _a;return 0;再看new和deletedelete p2;new/delete和最大区别是new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数而对于内置类型几乎是一样的free(p3);delete p4;这是汇编一览图:此时多出来了一个。原创 2024-05-03 08:00:00 · 2735 阅读 · 35 评论 -
C++奇迹之旅:类和对象const成员&&static关键字&&友元&&内部类
成员函数是指在类中被声明为 的成员函数将修饰的“成员函数”称之为成员函数,修饰类成员函数,实际修饰该成员函数隐含的指针,表明在该成员函数中不能对类的任何成员进行修改。我们来看看下面的代码请思考下面的几个问题:小结: 关键字的使用只会导致权限的放小,不会导致权限的放大。对成员变量只读时,建议加上关键字,需要修改成员变量,不能加指针这两个默认成员函数一般不用重新定义 ,编译器默认会生成。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指原创 2024-04-29 21:02:49 · 1789 阅读 · 7 评论 -
C++奇迹之旅:初始化列表与explicit
在创建对象时,编译器通过调用构造函数,给对象中各个变量一个合适的初始值虽然上面构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,这和我们之间常常说的给缺省值其实就是赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。初始化列表:以一个冒号开始,接着是一个逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号的初始化或表达式为什么要有初始化列表来赋初值,不能直接给缺省值,或者传参吗?由于const必原创 2024-04-22 22:28:01 · 7426 阅读 · 120 评论 -
C++奇迹之旅:从0开始实现日期时间计算器
通过前面学完了C++的默认成员函数,实践出真知,本小节我们将一起来实现一个简单上手的日期时间计算器,阿森和你一起一步一步的操作实现!完整代码在文章末尾哦通常我们可以输入的时候是不是想这样输入:cin>>d1或者输出cout原创 2024-04-22 08:00:00 · 1918 阅读 · 16 评论 -
C++奇迹之旅:赋值运算符重载与隐式类型转换
运算符重载是C++中的一个重要特性,他允许我们为自定义的类型定义自己的运算符行为。通过运算符重载,我们可以使用与内置数据类型相同的语法来操作自定义类型,从而提高代码的可读性和可维护性。还是我们熟悉的日期函数:然后我们定义两个日期对象d1和d2:当你想要比较两个对象d1和d2的数据是否一样,这是通常的比较方法:创建一个专门的比较函数来比较两个对象是否相同。很明显的可以看出这是个比较函数,能不能直接通过像内置类型那样来比较相同呀,因此运算符重载就来了:C++为了增强代码的可读性引入了运算符重载,运算符原创 2024-04-20 11:09:41 · 2884 阅读 · 100 评论 -
C++奇迹之旅:深入思考拷贝构造函数
实践中总结:1、如果没有管理资源,一般情况不需要写拷贝构造,默认生成的拷贝构造就可以。如:Date2、如果都是自定义类型成员,内置类型成员没有指向资源,也类似默认生成的拷贝构造就可以。如: MyQueue3、一般情况下,不需要显示写析构函数,就不需要写拷贝构造4、如果内部有指针或者一些值指向资源,需要显示写析构释放,通常就需要显示写构造完成深拷贝。如:Stack Queue List等。原创 2024-04-18 21:51:53 · 2453 阅读 · 15 评论 -
C++奇迹之旅:构造函数和析构函数
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。🌠 构造函数🌉 概念对于以下Date类:对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员原创 2024-04-17 18:46:51 · 1443 阅读 · 17 评论 -
C++奇迹之旅:隐含的this指针
在编程中,有一个特殊的指针叫做指针,它在类的成员函数中扮演着重要的角色。本文将从一个简单的例子开始,逐步探讨指针的概念、作用和用法。我们先来定义一个日期类 对于上述类,有这样的一个问题:类中有 与 两个成员函数,函数体中没有关于不同对象的区分,那当调用 函数时,两个类和调用的是同一个函数,该函数是如何知道应该设置对象,而不是设置对象呢?我们先看一个打印函数print(),里面访问的成员变量是哪里的,是private声明下的吗?其实不是,这里只是声明,没有分配空间,访问的是类对象d1,d2各原创 2024-04-15 19:57:00 · 1776 阅读 · 21 评论 -
C++奇迹之旅:探索类对象模型内存的存储猜想
上回我们学习了类的定义,初步了解了什么是类?publicprivateprotected,本小节将讲解类的实例化,类对象模型的猜想存储,及三种简单类的计算。在 C++ 中,类的实例化是指创建一个类的对象。当我们定义了一个类之后,就可以根据这个类创建出多个对象。这个过程就称为类的实例化。原创 2024-04-10 17:53:04 · 7806 阅读 · 129 评论 -
C++奇迹之旅:我与类和对象相遇
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。我们定义一个学生类:姓名,性别,年龄。int name;int sex;int age;在定义成员变量时,为了避免与函数参数名称混淆,通常会在成员变量前加上下划线_作为前缀。这样可以很方便地区分成员变量和函数参数。原创 2024-04-08 23:26:32 · 1879 阅读 · 14 评论 -
我的C++奇迹之旅:内联函数和auto关键推导和指针空值
内联函数是一种编译器优化技术,它可以将函数的代码直接插入到函数调用的地方,而不是通过函数调用的方式。这样可以减少函数调用的开销,提高程序的执行效率。举个例子,当你在一个项目中,想要频繁调用一个Add函数当你调用一千次,一万次,函数栈帧相应的要建立这么多次,对于代码空间和时间考虑,消耗大,也浪费。此时,你肯定在想到中的宏来在代码进行预处理解决当然你也要注意括号问题,在使用宏定义时需要格外小心,因为宏定义是在编译时进行替换的,如果定义不当可能会导致一些意料之外的行为,避免出现以下有关括号写法问题:代码测原创 2024-04-06 18:43:56 · 2182 阅读 · 23 评论 -
我的C++奇迹之旅:值和引用的本质效率与性能比较
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。我们接下来看看引用后的地址是否会发生改变:例如以下例子:代码运行图:在这个代码中,定义了一个变量为,; 这里是的引用,给取了一个外号,; 这里是的引用,又给取了一个外号是,因此我们对还是对进行修改,都会发生改变,这是因为编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体引用本质上就是原创 2024-04-02 10:58:46 · 2571 阅读 · 28 评论 -
我的C++奇迹之旅相遇:支持函数重载的原理
函数重载概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。//参数类型不同//参数个数不同void f()//参数类型顺序不同1. 通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。原创 2024-03-31 17:12:11 · 3125 阅读 · 143 评论 -
C++奇迹之旅(三):缺省参数与函数重载
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。C++中的缺省参数可以细分为全缺省参数和半缺省参数两类:C++中的缺省参数可以细分为全缺省参数和半缺省参数两类:全缺省参数(Default arguments):例如:半缺省参数(Partial default arguments):例如:这是因为:所以,正确做法是:缺省参数的值必须是常量或者全局变量。这是因为函数调用时,缺省参数需要直接用其值替换,所以值必须在原创 2024-03-30 21:06:58 · 1125 阅读 · 42 评论 -
【C++的奇迹之旅(二)】C++关键字&&命名空间使用的三种方式&&C++输入&输出&&命名空间std的使用惯例
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。为后续类和对象学习打基础。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。1. 正确的命名空间定义//正确的命名空间定义//命名空空间中可以定义变量/函数/类型int data;原创 2024-03-29 19:46:37 · 1771 阅读 · 70 评论 -
【C/C++】从零开始认识C++历程-启航篇
这里我们开始学习C++的开始之路,开启学习C++的学习,本节主要是先了解C++的通识内容,了解一下C++是啥,为什么要学习C++呢?C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。原创 2024-03-29 11:30:14 · 1506 阅读 · 10 评论 -
【C++】C++对C语言的关系,拓展及命名空间的使用
C++中的命名空间是一种封装标识符(如变量名、函数名、类名等)的方式,用于防止命名冲突。命名空间允许组织代码以避免可能出现的标识符冲突,尤其是在大型项目或者在使用多个库时。它可以被视为一种定义标识符的作用域,这些标识符在该命名空间内是可见的,而在命名空间外则不是。namespace 名称 {// 定义变量、函数、类等 }这里,名称是你给命名空间指定的名字,可以根据需要在里面定义变量、函数、类等。例如,定义一个名为// 函数实现使用命名空间内的成员时,需要使用命名空间的名称和作用域解析运算符。原创 2024-02-25 22:46:17 · 1622 阅读 · 48 评论