C++模块学习
文章平均质量分 65
不会学习的小白O^O
这个作者很懒,什么都没留下…
展开
-
C++多态(下)
这时候Derive有一个func3,是我自己子类加的,Deriver重写了func1,两张Base1、Base2两张虚表都覆盖,没问题,但是我func3放在哪呢?哪道子类当中未重写的虚函数就不进虚表了嘛 --- Func2一定会进虚表的。如果子类有一个没有完成重写的虚函数,那这个虚函数的地址也会放进虚表。自己的func3放在Base1的虚表,先继承的父类的虚表当中。func3是放进第一个的虚表呢,还是第二个的虚表呢?p1和p2是否共用一个虚表?父类是父类的虚表,子类是子类的虚表。原创 2023-05-04 15:55:44 · 344 阅读 · 0 评论 -
C++(多态中)
我们这里的析构函数不是虚函数,所以这里就是一个普通调用,普通调用就是在编译就决定了析构函数的地址,在编译的时候这里call 的一个函数 就是Person当中的虚函数(按ptr1的类型去调)但是这里我们想调用的并不是Person的析构函数,我们想调用的是Student的析构函数。概念 : 在虚函数后面写上=0,则这个函数为纯虚函数,包函数纯虚函数的类叫抽象类(也叫接口类),抽象类不能实例化对象,派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。虚表当中放的是虚函数的地址。原创 2023-05-03 00:44:04 · 632 阅读 · 0 评论 -
C++(多态上)
整形的大小是4字节,然后char的大小是1字节,加起来5字节,不过呢内存对齐嘛,以4字节内存对齐,Base的大小得是4的整数倍。这里要是不构成多态,那么p.BuyTicket(),调用的就全是父类当中的那个BuyTicket(),这里st对象、sd对象传参给Func都发生了切片。但是这里构成了多态,也发生了切片,但是呢构成了多态,跟p的类型就没有关系,而是看它传过来指向的对象了。那么我们的多态的原理(是如何做到指向谁就调用谁的),我们先简单讲讲。func调用的肯定是子类的,最主要的这里的val是谁的。原创 2023-05-01 01:31:18 · 860 阅读 · 0 评论 -
C++(继承和组合)
对象组合是类继承之外的另一种复用选择,新的更复杂的功能可以通过组装或组合来获得,对象组合要求被组合的对象具有良好定义的接口,这种复用风格被称为。组合C的公有我通过C对象可以直接用,C的保护我组合了之后不能直接用,D访问的时候,访问不了(相当于就是在C的类外访问了)这些关系都适合用继承来表达 ----> 继承了之后父类的成员就变成了子类的一部分,子类对象可以直接用。组合: 是一种has -a(有一个) 的关系,假设B组合了A,每个B对象中都有一个A对象。优先使用对象组合对象,而不是类继承。原创 2023-04-29 15:50:53 · 764 阅读 · 0 评论 -
C++菱形继承(再剖析)
所以说菱形虚拟继承是更复杂的,而且效率对也是有一定的影响,当我们去找虚基类的时候,需要先通过指针找到虚基表,在通过虚基表当中的偏移量,将地址加减来找到我们的虚基类。上面我们是看 D对象虚继承模型当中的B ,可是我们如果单看一个B呢,就仅仅只是一个单继承了(或者说是加了虚继承的单继承)可是为什么要这么设计呢(连腰部的类都要这么设计,将公共的A统一放到了最下面)?虚继承连腰部(B、C)的类的内存模型都会受到影响,影响的不仅仅是D。编译器不需要去区分,传的D还是B了,直接去按统一的方式去找_a。原创 2023-04-29 12:14:39 · 1232 阅读 · 0 评论 -
C++(继承下)
但是你节省的是A对象,此时A对象是一个只有一个整形成员,但是如果A当中的成员是一个数组呢 _a[1000] 4000个字节 ,那么我们如果不使用虚继承的话,在内存当中B 、C对象都继承一份,就需要8000字节,但是如果使用虚继承的话,就只需要存一份在公共区域4000字节,只是多花4字节的指针指向这个区域罢了。有元函数是一种定义在类外的函数,但是需要在类内声明即可(有元函数是可以在类外访问类内的变化/私有成员的一种特殊函数)但是如果Display也许想在类外访问子类的私有/保护成员怎么办呢?原创 2023-04-27 12:15:12 · 1530 阅读 · 2 评论 -
C++(继承中)
(对于内置类型不处理,当年给了缺省值就用缺省值去处理,对于自定义类型会调用自定义类型的构造函数)如果我们的父类没有默认构造函数呢 ,或者说我们不想让我们的Pter去初始化我们_name变量呢。之前来说同类型的对象可以赋值转换,不同类型的赋值转换要么是强制类型转换,要么就是隐式类型转换。为什么父类是析构次数是子类析构次数的double --- 原因是什么呢?父类没有默认构造函数了 ------- 那么子类只能自己自定义构造函数。上面是我们的构造,那我们的子类的拷贝构造呢。我们可以来观察一个现象。原创 2023-04-25 13:19:40 · 406 阅读 · 0 评论 -
C++(继承(上))
2.基类的私有成员在子类都是不可见,基类的其它成员在子类的访问方式=Min(成员在基类的访问限定符 , 继承方式) public > protected > private。3.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好 还是显示的写出继承方式。这里是可以的 --- 同一个域不能定义同一个变量,但是这里是不同的域,父类和子类是独立的作用域(全局域和局部域可以定义同一个变量)那么我们的继承是如何体现出复用的呢?原创 2023-04-24 17:05:57 · 404 阅读 · 1 评论 -
模板的分离编译
我们在指定一个还没有实例化的模板 (这里的vector<T>就是还没有实例化的模板),然后我们要取里面的内嵌类型。最主要的原因是因为push_back定义和声明分离了,这里insert没有报的原因是因为insert没有被调用。链接是去符号表找地址,可为什么在符号表也找不到push_back 、 insert 的地址呢?编译能通过后我们运行我们的test.cpp,发现报错了,报了一个链接错误。2.在.cpp显示实例化(不推荐,太麻烦,换一个类型就要显示实例化)那么在什么时候我们需要加typename呢?原创 2023-04-15 16:38:13 · 471 阅读 · 0 评论 -
优先级队列的模拟实现(仿函数)
我们直接用库里的 less 和 greater ,控制我们的比较。那么写了一个迭代器期区间的构造,我们就需要在实现一个的构造函数。我们写了一个显示构造函数,编译器就不会在默认生成构造函数。它的less的类对象可以像函数一样去使用。优先级队列的底层类似于一个数组的东西。调用它自己的默认拷贝构造。我们需要实现向上调整。3.迭代器区间的构造。我们less默认是大堆。greater是小堆。原创 2023-04-12 01:12:28 · 419 阅读 · 0 评论 -
list 迭代器学习
我们之前学习了 string、vector的遍历,使用迭代器即可,我们直接使用原生指针++,解引用即可走到存储下一个数据的位置,和取到下一个数据。那么我们的list并表示一段连续的物理空间了,不能简单的使用原生指针++,解引用来遍历list。通过迭代器往前走,怎么往前走,就是通过改变迭代器对象内成员的存储的节点地址,改成下一个节点的地址。那么我们来想一想我们应该怎么来改进迭代器来遍历list呢?我们在根据需要的迭代器需要的功能去实现封装就可以了。我们想想C++的优势是什么呢?不就是类封装和运算符重载嘛。原创 2023-03-29 14:23:52 · 62 阅读 · 0 评论 -
vector 完整模拟实现
【代码】vector 完整模拟实现。原创 2023-03-22 23:43:28 · 58 阅读 · 0 评论 -
memcpy的浅拷贝问题剖析
delete[] _star 将原来的空间进行析构,导致新空间中的string类中 _star 指向的空间已经被释放了。memcpy之后,将string中的成员变量拷贝到新空间。当我们插入第五个字符串时就不一样了 (程序就崩溃了)在扩容时,我们需要对string进行深拷贝。那么下面这个为什么不会有问题呢。原创 2023-03-22 14:21:31 · 505 阅读 · 0 评论 -
迭代器失效问题剖析
这里删除之后,挪动完数据,删除完的位置上就变成了删除元素的下一个,it也就指向了下一个元素,来进行while循环判断。这里的问题也就涉及到我们的迭代器失效的问题(为什么就会迭代器失效了呢)好像也没有什么太大的问题,那么我们换一些数据来删除看看。我们可以在insert中返回更新后的pos。原创 2023-03-22 03:55:48 · 85 阅读 · 0 评论 -
string类(下集)
string类()下集原创 2023-03-03 13:33:45 · 49 阅读 · 0 评论 -
string类模板(上集)
string类原创 2023-03-02 20:18:17 · 65 阅读 · 0 评论 -
模板初阶
模板初阶原创 2023-02-28 00:17:41 · 43 阅读 · 0 评论 -
介绍operator new、operator delete函数
C++内存管理原创 2023-02-24 23:56:18 · 694 阅读 · 0 评论 -
new和malloc区别
new/delet和malloc/free原创 2023-02-23 02:28:55 · 117 阅读 · 0 评论 -
explicit、static关键字详解
explicit 、 static搞懂原创 2023-02-21 01:09:21 · 52 阅读 · 0 评论 -
初始化列表
初始化列表原创 2023-02-20 13:51:34 · 82 阅读 · 0 评论 -
流插入和流提取的重载
流插入和流提取重载原创 2023-02-20 00:57:51 · 173 阅读 · 0 评论 -
const修饰成员函数
const修饰成员函数原创 2023-02-19 14:58:48 · 91 阅读 · 0 评论 -
编译器对拷贝构造函数的优化
编译器对拷贝构造的优化机制原创 2023-02-19 01:10:14 · 321 阅读 · 1 评论 -
实现一个完整日期类
日期类的实现原创 2023-02-18 14:16:39 · 249 阅读 · 0 评论 -
类默认成员函数(赋值拷贝函数)
赋值拷贝函数原创 2023-02-16 17:27:16 · 91 阅读 · 0 评论 -
运算符重载
运算符重载详解原创 2023-02-16 00:12:03 · 75 阅读 · 0 评论 -
类默认成员函数之拷贝构造函数
拷贝构造函数原创 2023-02-14 22:26:14 · 577 阅读 · 1 评论 -
类默认成员函数 - 析构函数
析构函数原创 2023-02-14 01:18:53 · 445 阅读 · 0 评论 -
类默认成员函数之构造函数
类中默认构造函数原创 2023-02-14 00:34:53 · 69 阅读 · 0 评论 -
this指针的介绍
揭开this指针的面纱原创 2023-02-13 01:02:10 · 51 阅读 · 1 评论