- 博客(27)
- 收藏
- 关注
原创 虚函数表和虚函数表指针的创建时机
如果类没有构造函数,编译器会生成一个默认的构造函数,从而为类的vptr初始化。1、调用基类的构造函数,先将基类的虚函数表地址赋值给vptr。对象构造时,在构造函数中将虚函数表指针赋值给对象vptr(对象的起始地址)2、调用子类的构造函数,将子类的虚函数表地址赋值给vptr。编译器发现类中包含virtual关键字修饰的函数就会创建虚函数表。虚函数表的内容在编译器编译的时候已经生成。虚函数表存在于全局数据区的只读数据段中。虚函数表是存放虚函数的地址的数组。
2024-07-26 19:47:22 85
原创 C++ final关键字和override关键字
修饰类:当 final 用于修饰类时,表示该类是一个最终类,不能被其他类继承,这在某些情况下非常有用,比如当你想确保一个类的行为不会被修改时。2. 帮助编译器进行更严格的检查,如果声明为 override 的函数与基类中的虚函数签名不匹配,编译器会报错,从而避免一些潜在的错误。- 修饰虚函数:当 final 用于修饰虚函数时,表示该函数在派生类中不能被重写,这可以防止子类意外或故意地改变父类的行为。在 C++中, override 关键字主要用于明确表示派生类中的函数是对基类中虚函数的重写。
2024-06-19 23:16:28 117
原创 C++ 多态性及其原理
简而言之,多态就是多种形态,对同一件事,不同的对象的处理动作有多种形态。C++ 的多态性有两种,一种是静态多态,一种是动态多态。
2024-06-17 22:09:38 161
原创 C++ 菱形继承问题
通过虚继承的方式来解决菱形继承的问题,虚继承会为基类与派生类之间创建虚基表,编译器通过虚基表指针的偏移找到对应的变量地址,达到访问同一块空间的目的。菱形继承造成的后果有两个:1.造成二义性,二义性就是C的父类有相同的成员,通过C去访问名字相同的成员造成编译器不知道我们具体访问的是B1中的变量还是B2中的变量。菱形继承是因为C++有多继承的特性,如一个类C继承于B1、B2,而B1、B2继承于同一个类A,那么这时A、B1、B2、C之间会产生一种形似菱形的关系结构,这种关系结构称为菱形继承。2.菱形继承的后果?
2024-06-14 19:37:53 132
原创 C++ 设计模式——代理模式
代理模式指代理控制对其他对象的访问,也就是代理对象控制对原对象的引⽤。代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实 现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象。• 静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经 确定了代理类要代理的是哪个被代理类。• 动态代理指的是,在运⾏时才动态⽣成代理类,并将其与被代理类绑定。这意味着,在运⾏时才能 确定代理类要代理的是哪个被代理类。
2024-03-05 19:32:43 475
原创 C++ 设计模式——建造者模式
建造者模式是⼀种创建型设计模式,使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,能够将⼀个复杂的对象的构建与它的表⽰分离,提供⼀种创建对象的最佳⽅式。主要⽤于解决对象的构建过于复杂的问题。• 指挥者Director类:统⼀组建过程,提供给调⽤者使⽤,通过指挥者来构造产品。• 抽象Builder类:创建⼀个产品对象所需的各个部件的抽象接。• 具体产品的Builder类:实现抽象接⼝,构建各个部件。• 具体产品类:⼀个具体的产品对象类。
2024-03-05 19:29:48 348 1
原创 C++ 设计模式——工厂模式
抽象⼯⼚模式:⼯⼚⽅法模式通过引⼊⼯⼚等级结构,解决了简单⼯⼚模式中⼯⼚类职责太重的问 题,但由于⼯⼚⽅法模式中的每个⼯⼚只⽣产⼀类产品,可能会导致系统中存在⼤量的⼯⼚类,势 必会增加系统的开销。假设有 A、B两种产品,则开两个⼯⼚,⼯⼚A负责⽣产产品A,⼯⼚B负责⽣产产品B,⽤⼾只知道产品 的⼯⼚名,⽽不知道具体的产品信息,⼯⼚不需要再接收客⼾的产品类别,⽽只负责⽣产产品。⼯⼚⽅法模式每次增加⼀个产品时,都需要增加⼀个具体产品类和⼯⼚类,这会使得系统中类的个数成倍增加,在⼀定程度上增加了系统的耦合度。
2024-03-05 19:13:20 359 1
原创 C++ 设计模式——单例模式
⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个 访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息 存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个 单例对象获取这些配置信息,这种⽅式简化了在复杂环境下的配置管理。单例模式有两种实现模式:饿汉模式和懒汉模式。
2024-03-05 16:45:41 348 1
原创 冯诺依曼体系结构
输入设备首先将需要计算的数据与加载到内存中,CPU按需从内存中获取需要的数据,后将得到的结果输出到内存,由内存交给输出设备。内存存在的原因:木桶效应,由于外设和CPU的速度相差极大,总体效率被外设拉低,增加内存提高效率。不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)。外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。一句话,所有设备都只能直接和内存打交道。这里的存储器指的是内存。
2023-09-09 21:11:52 61 1
原创 网络基础(一)
负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.就需要有人站出来, 约定一个共同的标准,大家都来遵守, 这就是。
2023-08-04 15:59:02 64 1
原创 MySQL 数据库 表的操作
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准。collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准。在users表添加一个字段,用于保存图片路径。不同的存储引擎,创建表的文件不一样。users.frm:表结构。users.MYD:表数据。users.MYI:表索引。在users表添加二条记录。
2023-07-20 21:28:36 47
原创 MySQL数据库基础
我们用常规的文件去保存数据的时候,会有很多缺点,例如,文件的安全性问题、文件不利于数据查询和管理、文件不利于存储海量数据、文件在程序中控制不方便;为了解决以上问题,专家们设计出更加利于管理数据的东西——数据库,它能更有效的管理数据。
2023-07-18 20:00:32 55 1
原创 memory库函数-memcpy及memmove的模拟实现
你还在为数组的拷贝而发愁吗,你还不能完美的拷贝你想要的数组吗,这篇文章会解决你的烦恼!!!
2022-09-18 21:47:58 479
原创 入坑级C语言(超级无敌噼里啪啦细)!!!
这里是关于C语言最简单最基础的知识框架,用于启蒙或者梳理知识体系,如果你是刚刚入坑的小伙伴,那么这篇文章一定会对你有所帮助,确定不进来看看吗?
2022-07-22 19:58:17 257 2
原创 给编程小白的未来规划
对于很多初学者来说c语言是启蒙语言,但是c语言并不简单,想要学好c语言也要下深功夫,脚踏实地,慢慢积累。建议每天坚持编程,每天一道题,也许一星期以后并不能看出你和其他人的不同,但是几个月,几年后你就会发现你和其他人的不同(这波你已经在大气层了!学习计划这一方面相信很多小伙伴都或多或少的有所了解,没有头绪的小伙伴可以参考网上的各种大神,制定属于自己的学习计划。(他真的很难doge哈哈)不急慢慢来,首先学好c语言,脚踏实地,不怕走的慢就怕,停滞不前。和我一样追逐梦想的小伙伴们,做大做强,早日进大厂!...
2022-07-15 16:23:52 674 7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人