C++
文章平均质量分 94
C++学习,由初阶到进阶
fresh hacker
所有命运的馈赠,早已在暗中标注好了价格。
展开
-
【C++】继承:深度剖析
此时就出现了一个问题,类D的实例化对象中,既有B类也有C类,然而B和C都有A类,那么此时D中就出现了两个A类,造成了数据冗余,于是可以使用虚拟继承来解决。子类和父类中有同名成员时,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义(在子类成员函数中,可以使用 基类::基类成员 显式访问)例如:在师生关系中,学生和老师的共同信息有:姓名,性别,年龄,身高等,同时学生又有一些特有的信息:学号,学院等,老师也有特有信息:工号,所教科目等。友元关系不能继承,父类友元不能访问子类的私有和保护成员。原创 2024-09-12 10:00:00 · 1092 阅读 · 0 评论 -
【C++】模板:进阶(仿函数深度剖析)
仿函数本质就是一个类,此类中重载了运算() ,因此它使用起来就和函数很像,就叫仿函数在之前了解的优先级队列中,有这样一个缺省参数叫less,其实这就是一个仿函数,它会将优先级队列变成大堆,同样在标准库的sort中也使用了less,默认排出的升序。与less对应的是greater,它和less相反,greater将优先级队列变成小堆,sort变成降序。原创 2024-09-10 10:00:00 · 751 阅读 · 0 评论 -
【C++】栈和队列、优先级队列、适配器原理
无论是栈还是队列,其模板参数中都有一个Container,缺省值为deque,这里就要引入一个叫做“适配器”的概念deque又被称作双端队列,是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,同时时间复杂度都为O(1),与vector比较,头插效率高,不需要频繁挪动元素,而与list相比则空间利用率比较高接下来看看deque的对应接口:可以发现deque不仅既有头插尾插,头删尾删,并且还支持方括号[]访问 ,难道它底层也是连续的物理空间吗?原创 2024-09-08 10:00:00 · 1857 阅读 · 0 评论 -
【C++】list类:模拟实现(适合新手的手撕list)
利用临时对象来进行拷贝构造实际上是一种精妙的方法,它先定义了一个临时变量tmp,利用迭代器区间构造深拷贝了x的所有值,随后将新创建节点的_head以及_size跟tmp交换即可,同时,出了作用域以后tmp作为临时对象就会销毁,调用析构函数,由于此时已经交换了,那么此时实际实在销毁原先新节点的内存。指的注意的是,本来使用该迭代器需要用第一个->来找到data(当储存结构体类型时),然后再使用一个->才能查找到结构体内部的数据,但编译器为了代码的可读性,帮助我们省略了一个箭头,只需要一个箭头就可以访问数据了。原创 2024-09-06 10:00:00 · 765 阅读 · 1 评论 -
【C++】容器list常用接口详解
list是一个带头双向循环链表由于是链表,物理空间不连续,不支持随机访问数据,因此和vector相比,少了[]访问和resize、reserve等容量相关的函数与其他序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2024-09-04 11:41:01 · 898 阅读 · 1 评论 -
【C++】vector类:模拟实现(适合新手手撕vector)
本文自己模拟实现c++标准库里的vector类,加深对vector的深入理解原创 2024-09-04 10:00:00 · 873 阅读 · 0 评论 -
【C++】vector迭代器失效问题
/构造一个1,2,3,4构成的vectori < 5;i++)//找到其中3这个值的位置这就是一个典型的迭代器失效问题,要弄清楚为什么,首先我们需要清楚一点:vector的每一次扩容都不是在原地扩容,而是新开辟一块空间后将原先的数据拷贝到新空间而这就产生了一个问题,第一次insert的pos是表示3的位置,但第二次insert时pos还是表示3的位置吗?原创 2024-09-02 10:00:00 · 1759 阅读 · 3 评论 -
【C++】容器vector常用接口详解
vector是表示可变大小数组的序列容器就像数组一样,vector也采用的是连续储存空间,这意味着可以采用下标对vector的元素进行访问,和数组一样高效。但和数组又有不同,它的大小是可以动态改变的,而且它的大小会被容器自动处理本质讲,vector使用动态分配数组来储存它的元素。当有新元素插入时,为了增加储存空间这个数组需要重新分配大小,其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因此,每当一个新的元素加入到容器时,vector并不会每次都重新分配大小。原创 2024-08-31 10:00:00 · 1065 阅读 · 0 评论 -
【C++】string类:模拟实现(适合新手的手撕string)
本文承接上文对C++string类的标准库介绍,亲自来模拟实现下string类的简单功能原创 2024-08-22 10:00:00 · 813 阅读 · 0 评论 -
【C++】String类:标准库介绍
在C语言中,字符串是以'\0'结尾的字符数组,需要手动管理内存和处理字符串操作。在头文件string.h中提供了一系列库函数,如strlen、strcpy、strcat等来对字符串进行操作。但这些函数和字符串是分离的,需要手动管理内存,容易出现越界访问等问题。因此,在C++标准库中,提供了string类,它封装了字符串操作,提供了丰富的成员函数和运算符重载,使得字符串的操作更加方便和安全。原创 2024-08-20 10:00:00 · 870 阅读 · 0 评论 -
【C++】模版:范式编程、函数模板、类模板
为了应对以上问题,应运而生。就像活字印刷中的模板一样,根据模板能够印出对应的字,根据颜料的不同,又能印出颜色不同的字,放在C++中也是同理,存在模板这样一个模具,在这个模具中填入不同材料(类型),得到不同的结果,这就是范式编程。原创 2024-08-04 10:00:00 · 1068 阅读 · 0 评论 -
【C++】内存管理(使用+底层原理解析)
return 0;根据上图展示的结果,可以发现使用new关键字来开辟空间时会自动调用构造函数,同时delete也会自动调用析构函数 ,这就是new/delete与malloc/free的最大区别,因此,在内置类型时两者几乎相同,但对于自定义类型而言,就更推荐使用new/delete了。原创 2024-08-07 10:00:00 · 1589 阅读 · 0 评论 -
【C++】类和对象(下):初始化列表、类型转换、友元
内部类默认是外部类的友元类,内部类本质是一种封装,当A类和B类紧密关联,A类的实现就是为了给B类使用那么就可以考虑把A设计为B的内部类,若放到private/protected位置,就是专属内部类,其他地方无法访问。原创 2024-07-20 10:00:00 · 1779 阅读 · 0 评论 -
【C++】类和对象(中):构造、析构、拷贝构造、运算符重载
由于上述特性,在写拷贝构造时,参数一定要写正确,是类类型的引用,不是引用而是传值传参:Date(const Date d)则会引发无穷递归当使用Date d2(d1)时是调用拷贝构造函数,调用函数先要传参,这里传参d1对应的是Date类型,也就是。原创 2024-07-18 10:00:00 · 868 阅读 · 0 评论 -
【C++】类和对象(上):类、实例化、this指针
众所周知,C语言是面向过程的语言,对于每一个过程都有一个对应的函数来实现,每个函数都相对独立,但随着计算机发展,问题的场景也越来越复杂,面向过程在大型系统开发中捉襟见肘,面向对象思想运营而生。其核心思想是:随着系统参与的实体越来越多,过程变得越来越复杂,那么就不必费力去描述每一个可能的过程了,转而描述每一个实体,如果每一个实体都被正确描述了,那么这些实体置于系统中,系统就能正确运行。C++作为面向对象的编程语言,描述每一个现实世界的实体都可以使用关键字Class(类)来进行定义。原创 2024-07-16 10:00:00 · 1051 阅读 · 0 评论 -
【C++】入门基础(引用、inline、nullptr)
引用不是新定义一个变量,而是给已经存在的变量取一个别名,,它和它引用的变量共用同一块内存空间。简单来说,引用就是起别名,例如水浒传中林冲又名豹子头,这就是取别名,同时,林冲死了也就意味着豹子头死了,两者指向的都是同一个人。原创 2024-07-14 10:00:00 · 612 阅读 · 0 评论 -
【C++】入门基础(命名空间、缺省参数、函数重载)
使用namespace关键字定义一个域,这个域跟全局域各自独立,不同的域中可以定义相同名字的变量,这就避免的命名的冲突。其中C++标准库都放在一个叫std(standard)的命名空间中。例如以下代码:同一个名的变量rand在不同域中表现不同的内容TIPs:cout原创 2024-07-12 18:36:13 · 1063 阅读 · 0 评论