- 博客(28)
- 收藏
- 关注
原创 特殊类的设计
不能调用拷贝构造和赋值运算符重载定义为私有是为了在外面不能被调用,只声明不是实现是为了内部不会调用,友元类不能调用,书写反而简单补充:如果函数只是声明或者在函数内部没有使用形参,可以不写形参名默认成员函数=delete;表示直接删除这个默认成员函数。
2026-03-31 23:05:47
302
原创 智能指针简介
上面场景如果ptr1这里的new报异常,则不会产生内存泄漏,如果ptr2这里的new报异常,则ptr1的指向的内存将会泄漏,如果div(),抛出异常,则ptr1和ptr2指向的内存将会泄漏。如果使用try,,,catch捕获异常将会套好几层trycatch,处理起来麻烦.
2026-03-29 21:18:45
364
原创 包装器简介
可以使用()运算符进行调用的对象,本质是能像函数一样使用的东西常见课调用对象:函数指针,仿函数,lambda表达式我们能否使用统一的方式对其封装,进行调用,这时候就可以使用包装器。
2026-03-26 22:45:48
341
原创 C++11特性简介2
在c++11之前,如果想对数据排序,可以使用sort但是如果对于自定义类型,想要根据需求进行排序,那么必须定义比较规则这样写就需要对每一个字段写一个仿函数规定排序规律,如果有多个类,定义的排序规律就越来越多。
2026-03-23 23:04:58
359
原创 C++11新增特性简介1
c++11用{}的使用范围,使其可用于所有内置类型和自定义类型经i进行初始化本质:调用构造函数,实现多参数的构造函数支持隐式类型转换注意:一切皆可用{}初始化,并且可以不写=, 建议日常定义,不要去掉=补充:如果不想通过隐式类型转换进行初始化,可以在构造函数前面加上explicitexplicit是 C++ 中的一个关键字,修饰构造函数,作用是禁止编译器利用该构造函数进行隐式类型转换,强制要求程序员显式地创建对象。
2026-03-17 22:04:16
327
原创 简单介绍哈希
线性探测的缺陷是产生冲突的数据堆积在一块,这与其找下一个空位置有关系,因为找空位置的方式就是挨着往后逐个去找,因此二次探测为了避免该问题,找下一个空位置的方法为:Hi = (H0 + i2) % m, 或者:Hi = (H0 - i2) % m。由于表长是定值,α 与 “填入表中的元素个数” 成正比,所以,α 越大,表明填入表中的元素越多,产生冲突的可能性就越大;注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些函数函数存在一定的误判。
2026-02-27 21:46:54
898
原创 简介红黑树
_kv(kv),_col(RED){}当插入一个新的节点时,设置该新节点的颜色为RED的原因:若是新节点的颜色黑色,因为性质4可知会影响到整个树的结构(难以维持红黑树的性质),而若新节点的颜色为红色,因为性质3可知只会影响到该条路径的结构。
2026-02-01 21:47:30
905
原创 简介AVL树
因此,两位俄罗斯数学家 G.M.Adelson-Velskii 和 E.M.Landis 在 1962 年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过 1 (需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。5.更新后parent平衡因子==2or-2,说明parent所在的子树的高度变化且不平衡,对parent所在的子树进行旋转,让其平衡(插入结束)1)如果父节点平衡因子为1或-1,则说明该子树的高度不变,结束向上更新。
2026-01-30 11:15:04
262
原创 简单介绍异常
抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被 catch 以后销毁。返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误,具体看下面的详细解释。异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包含堆栈调用的信息,这样可以帮助更好的定位程序的 bug。异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。
2026-01-27 22:22:29
479
原创 简单介绍多态
多继承中,派生类对父类的虚表进行拷贝(一个派生类中可能有多张虚表),同时对重写的虚函数进行覆盖(比如图中的func1函数,派生类对两个父类均进行了覆盖),派生类的未重写的虚函数放在第一个基类部分的虚函数表中(一般来说,哪个父类先继承,哪个父类部分在前)在虚函数的后面加上=0,则这个函数称为纯虚函数,包含纯虚函数的类叫抽象类(也叫接口类),抽象类不能实例化出对象,派生类继承后也不能实例化对象,只有重写纯虚函数,派生类才能实例化对象,纯虚函数规范了派生类必须重写,更体现出了接口继承。
2026-01-27 18:59:35
620
原创 简单介绍继承
B和C找到公共A的方式是:通过B和C的两个指针,指向一张表,这两个指针叫虚基表指针,这个两个表叫虚基表,虚基表中存的偏移量,通过偏移量可以找到下面的A。基类的私用成员在子类是不可见的,基类的其他成员在子类的访问方式=min(继承方式,访问限定符)(public>protected>private)1:不可见语法上限制访问(类里面和类外面都不能用,但是内存上存在),跟private成员也不一样,private成员类里面可以使用,类外面不能用。继承是一种白盒复用,派生类和基类之间的依赖关系很强,耦合度高。
2026-01-21 11:15:04
600
原创 仿函数+模板进阶
原因:在.cpp文件 中,编译器没有看到对push模板函数的实例化,因此,不会生成具体的push函数,在main中调用push,编译器在连接时才会找其地址,但是函数没有实例化,没有生成具体的代码,因此连接时报错。该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给出,因此函数模板不建议特化。eg:当存储类型为自定义类型的指针时,直接比较的话,比较其地址,可能造成的结果并非我们所想要,故要自己写仿函数。相比普通函数 / 函数指针,仿函数的核心优势的是。
2025-11-29 15:07:23
902
原创 内存管理+模板
3.malloc申请空间需要手动计算空间大小并传递 , new只需要在其后面加上空间的数据类型即可,如果是多个对象[]中指定对象个数即可。5.malloc申请空间失败时,返回值是NULL,因此使用时必须判空,new不需要,但是需要捕获异常(符合面向对象的结果)4.malloc的返回值为void*,在使用时必须强转 ,new不需要,因为new后跟的时空间的类型。在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数。1.malloc/free是函数, new/delete是操作符。
2025-08-23 00:45:33
384
原创 类和对象下
比如,上述Time类和Date类,在Time类中声明Date类为其友元类,那可以在Date类中直接访问Time类的私有成员,但在Time类中无妨访问Date类的私有成员。声明为static的类成员称为类的静态成员,用static修饰的成员变量称之为静态成员变量,用static修饰的成员函数称之为静态成员函数。友元函数:可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。友元函数可以访问类的私有和保护成员,但不是类的成员函数。
2025-08-22 23:53:17
294
原创 类和对象中
6.无参的构造函数和全缺省的构造函数还有编译器默认生成(前提我们没写)的构造函数都称为默认构造函数,并且默认构造函数(不传参就可以调用的)只能有一个。2.自定义类型:用struct/class等定义的类型,我们不写编译器默认生成构造函数(内置类型不做处理,自定义类型会去调用它的默认构造)3.需要释放资源的成员(都是自定义类型),不需要写析构,因为默认生成的析构函数会调用自定义类型自己的析构函数。注意:浅拷贝完成的是值拷贝,像是指针类型,浅拷贝后会只向同一地址,析构两次报错,一个修改会影响另一个。
2025-08-19 22:23:06
300
原创 类和对象上
C++ 中通过引入 this 指针解决该问题,即:C++ 编译器给每个 “非静态的成员函数” 增加了一个隐藏的指针参数,让该指针指向当前对象 (函数运行时调用该函数的对象),在函数体中所有 “成员变量” 的操作,都是通过该指针去访问。3.this 指针本质上是 “成员函数” 的形参,当对象调用成员函数时,将对象地址作为实参传递给 this 形参。4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2025-08-16 14:52:54
282
原创 C++入门
引用做参数(提高效率),当处理大对象(int a[10000000]等)或深拷贝对象时,引用与变量同一地址,不必再创建空间。引用不是定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟空间,它和它引用的变量共用一块内存空间,如count函数结束,栈帧销毁没有清理栈帧,那么ret的结果侥幸正确,反之,清理栈帧,那么ret的结果是随机值。依次取数组中的数据赋值给e,自动迭代,自动判断结束,e的改变不会影响数组,但是可以通过引用进行改变。1、引用概念上定义一个变量的别名,指针存储一个变量地址。
2025-08-14 19:47:33
405
原创 异常类+常用类+容器+泛型
Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。并响应适合用户观看的信息,进行提示。集合是一种容器,用来装数据,类似于数组,但是集合的大小可变,开发中也非常常用。每个对象对应一个Hash值,不同对象他们的哈希值大概率不相等,但有可能相等。2.可以作为方法内部的一种特殊返回值,以便通知上层调用者,方法的执行问题。TreeSet:添加的元素是有序(按大小排序,默认升序),不重复,无索引。但是,它的每个元素都额外的多了一个双链表的机制,记录它前后元素的位置。
2025-03-29 13:41:56
988
2
原创 类和对象(封装、继承、多态)
子类会先默认调用父类的无参构造器,若父类没有无参构造器(或其私有)则可以手动调用父类有参构造器。方法重写:当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称参数列表一样的方法,去覆盖父类的这个方法。注意private:私有属性可以继承,但不能直接访问(可以通过set,get访问)默认情况下,子类全部构造器的第一行代码都是super()会调用父类的无参构造器。继承后子类访问成员的特点:就近原则(先子类局部,再子类成员,然后父类成员)static Stirng name;
2025-03-21 20:32:33
417
4
原创 赋值运算符重载
4.作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this指针。: . 这5个运算符不能重载。返回类型 T&返回引用可以提高返回的效率,有返回值的是为了支持连续赋值。3.没有显示时,编译器会生成一个默认赋值运算符重载,以值的方式逐字拷贝。关键字operator后面接需要重载的运算符符号。2.赋值运算符只能重载成员函数,不能重载全局函数。返回*this,要符合连续赋值的含义。3.用于内置类型的运算符,其含义不能改变。2.重载操作符必须有一个类类型参数。
2024-12-01 21:55:41
250
原创 类和对象入门
class默认的访问权限为private,struct的默认的访问权限为public。注意没有成员变量的类对象需要1byte是为了占位,表示对象存在,但不存储有效数据。this指针存在在栈中,因为this指针作为形参,实参传给形参时需要压栈。c++中将结构体struct定义为了类,struct的用法都可以用。protected和private:修饰的成员不能在类外被访问。类中的函数可以声明和定义分离,在类里面定义的函数默认是内联函数。this不能再形参和实参显示传递,但是可以在函数内部显示使用。
2024-11-30 21:31:47
135
原创 C++ 引用
引用不是定义一个变量,而是给已存在的变量取了一个别名。编译器不会为引用变量开辟内存空间,他和他引用的变量共用一块内存空间。3.引用在引用一个实体后不能引用其他实体,指针可以在任何时候指向任何一个同类型实体。7.访问实体方式不同,指针需要显示检引用,引用编译器自己处理。引用结果为引用类型的大小,指针始终时地址空间所占的字节个数。1.引用概念上定义一个变量的别名,指针存储一个变量的地址。3.引用一旦引用一个实体,而不能引用其他实体。2.引用在定义时必须初始化,指针没有要求。5..有多级指针,但没有多级引用。
2024-11-27 16:38:36
212
原创 域——简单介绍
若想访问命名空间域的两个方法:1.展开命名空间域 2,指定访问命名空间域。展开命名空间域:using namespace dd;指定访问命名空间域:printf("%d",dd::a);域:类域,命名空间域,局部域,全局域。打印优先级:局部变量,全局变量;::a的左边为空白,则访问全局。默认不访问命名空间域;
2024-11-26 22:14:07
244
原创 计数排序与适用场景
计数排序适合范围集中且范围不大的整形数组排序,不适合范围分散或者非整形的排序如字符串,浮点数,结构体等。时间复杂度O(N+range)
2024-11-25 23:05:26
149
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅