- 博客(30)
- 收藏
- 关注
原创 string的底层原理
我们来看一下,string的底层就是一个字符型指针和一个size来表示string的大小,capacity来表示分配的内存大小。我们来看我们注释掉的第一个构造函数,我们是通过初始化列表来初始化size的大小,再通过size的大小来初始化其他两个变量的,为什么图中要多给_str开一个空间呢,这是因为要存放\0的原因。注释掉的第二个是无参构造,我们发现可以使用缺省参数来合并成为一个构造函数。我们给的缺省值是一个空字符串,但是在下面我们给过它空间之后就会自动有一个\0了,所以不需要我们手动给它\0的值。
2025-04-01 18:17:50
622
原创 string(入门)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 在使用string类时,必须包含#include头文件以及using namespace std; 会出错,这是因为 是一个整数数组,并非指针数组。 尝试把数组元素当成指针来处理,然而整数并不能隐式转换为指针,所以会产生编译错误。你可以直接使用范
2025-03-26 15:05:35
925
原创 内部类 ,匿名对象,编译器优化和静态成员
⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进⾏初始化。报错了,是因为不能直接给它值,这里只是声明,这里的值是缺省值,静态成员是属于静态区的,所以不会走初始化列表,所以不能给它缺省值,必须在类外初始化这样就是正确的了。静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。我们发现静态变量并不属于类本身,类的作用只是给静态变量了一个类域,使其访问受限。⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
2025-03-14 19:47:35
453
原创 初始化列表 , 类型转换,友元函数
之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。1.2 初始化列表有什么作用呢?我们来举个例子如上图,这就是一个简单的初始化列表,我们通过初始化列表给0和1赋值了。但是这些功能明明构造函数就能完成,为什么还要初始化列表呢?我们再来举个例子。
2025-03-14 14:20:56
796
原创 赋值运算符重载(下)
我们在上一个博客当中只写了部分的运算符的重载,我们将在这篇博客当中把他们补充完整。赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。赋值运算符重载的特点:1.赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成const当前类类型引⽤,否则会传值传参会有拷⻉。2.有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋值场景。
2025-01-20 11:00:00
826
原创 类和对象 --深拷贝和浅拷贝 赋值运算符重载
一.拷贝一.拷贝如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数 也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。拷⻉构造的特点:1.拷⻉构造函数是构造函数的⼀个重载。2.拷⻉构造函数的第⼀个参数必须是类类型对象的引⽤,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤。拷⻉构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引⽤,后⾯的参数必须有缺省值。3.
2024-12-12 14:10:19
819
原创 类和对象(2)--构造函数 析构函数
一.类的默认成员函数一.类的默认成员函数默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最 后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后⾯再讲解。默认成员函数很重要,也⽐较复杂,我们要从两个⽅⾯去学习:•第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。•。
2024-12-11 15:35:23
1118
原创 排序2(万字详细版)
快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素 序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩ 于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列 在相应位置上为⽌。快速排序也分为三个常用的,分别是hoare版本,挖坑法,lomuto前后指针。
2024-12-05 21:26:30
779
原创 排序1 (入门)
一. 排序概念及运⽤一. 排序概念及运⽤1.1概念排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的⼤⼩,递增或递减的排列起来的 操作。2.1 运用像这种大学的排名都运用到了排序的知识。接下来我们就来先讲几个基本的排序吧。
2024-11-30 11:13:59
830
原创 二叉树的层次遍历和判断是否为完全二叉树
树的层次遍历,按照一层一层的进行遍历。那么我们要怎么实现这个功能呢?我们在之前学过一个数据结构,叫做队列,我们来试一下,它们配合一下,看看是否可以完成这个功能。我们发现,用队列似乎是可以完成这个功能的,那么我们来操作一下。
2024-11-25 16:29:45
896
1
原创 链式二叉树 (非常详细)
一 .实现链式结构⼆叉树⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组 成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。其结构如下:创建了一个链式结构,left表示左孩子,right表示右孩子。
2024-11-25 14:39:40
807
原创 堆排序 (很详细 保姆级)
堆排序是利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,分为大顶堆和小顶堆。大顶堆的特点是每个节点的值都大于或等于其左右子节点的值,小顶堆则是每个节点的值都小于或等于其左右子节点的值。堆排序的基本思想是:先将待排序的序列构建成一个堆(初始建堆可以从最后一个非叶子节点开始调整,使其满足堆的性质),然后将堆顶元素(大顶堆的最大值或小顶堆的最小值)与堆的最后一个元素交换,此时最大(小)值就放到了它最终的位置。接着对剩下的n-1个元素重新调整为堆,重复这个过程,直到整个序列有序。
2024-11-24 08:00:00
620
1
原创 二叉树 --堆实现(顺序二叉树)
1.1树的概念与结构树是⼀种⾮线性的数据结构,它是由 nn>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。•有⼀个特殊的结点,称为根结点,根结点没有前驱结点。•除根结点外,其余结点被分成 M(M>0)个互不相交的集合T1T2……Tm,其中每⼀个集合 Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以有0个或多个后继。因此,树是递归定义的。
2024-11-23 08:00:00
846
原创 引用 (简单易懂)
1.引⽤的概念和定义引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";林冲,外号豹⼦头;引用就是给变量起一个别名,但是它俩都是同一个人,就跟你的小名一样,不管叫哪个名字,都是指的你自己。我们先写一个简单的引用案例吧。你像我们之前写的代码,这样并不能改变a的值,因为a和b都是变量都开辟了一块空间,是属于两个不同的人。这是结果。
2024-11-22 08:00:00
886
4
原创 C++入门 (很详细)
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数)我们来举个例子。这就是一个简单的例题,我们只需要传a的值,并不需要传入b的值,b就会被给与一个初值,当我们给b一个值的话,这个b的缺省参数就用不上了,还是会等于我们给的值,注意缺省参数只能从右往左给。•这样就是一个错误的,当我们只给一个值的时候,无法分清楚是给谁的。
2024-11-21 14:54:48
4540
2
原创 LinkedList与链表(1万多字超级详细版本)
双向链表(Doubly Linked List)是链表的一种。在双向链表中,每个节点不仅包含数据和指向下一个节点的指针(称为“后继指针”),还包含指向前一个节点的指针(称为“前驱指针”)。这使得双向链表在某些操作上比单向链表更具优势。例如,在双向链表中,可以直接从尾部向头部遍历,而单向链表只能从头部向尾部遍历。
2024-07-26 14:01:19
1063
5
原创 ArrayList与顺序表(很详细)
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:说明:是以泛型方式实现的,使用时必须要先实例化实现了接口,表明ArrayList支持随机访问实现了Cloneable接口,表明ArrayList是可以clone的实现了接口,表明ArrayList是支持序列化的5.和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者。
2024-07-18 22:56:46
2165
7
原创 JDK17语法新增特性
从springboot3.0开始,已经不⽀持JDK8了。从3.0开始,转变为JDK17。官⽅维护的版本都是SpringBoot3.X的了,但是之前的版本也是可以⽤的,只是官⽅不再进⾏功能更新了。综上所述,选⽤Java17,概括起来主要有下⾯⼏个主要原因:1. JDK17是LTS(⻓期⽀持版),可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版(JDK9-JDK16)去其糟粕,取其精华的版本;2. JDK17性能提升不少,⽐如重写了底层NIO,⾄少提升10%起步;
2024-07-16 22:41:17
1016
1
原创 equal方法和Comparable接口和Compartor接口(很详细)
接口的比较逻辑,就难以在不同的上下文中更改比较方式。2. 解耦:比较逻辑与被比较的类分离,使得类的设计更加专注于自身的核心功能,而比较逻辑可以在外部独立定义。1. 内聚性:将比较逻辑直接嵌入到要比较的类中,使相关的功能在同一个地方,增强了代码的内聚性和封装性。都是直接使用字符串常量创建的,当在常量池中已经存在 "abc" 时,它们会引用同一个常量池中的对象,所以引用相同。
2024-07-15 17:27:58
1229
8
原创 数据结构的基础(集合框架算法,复杂度和泛型)
Java 集合框架,又被称为容器container,是定义在java.util包下的一组接口interfaces 和其实现类 classes。其主要表现为将多个元素 element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、 管理 manipulate,即平时我们俗称的增删查改CRUD。例如,一副扑克牌(一组牌的集合、一个邮箱一组邮件的集合、一个通讯录一组姓名和电话的映射关系等等。
2024-07-15 15:03:34
2206
3
原创 Java深拷贝和浅拷贝(简单易懂)
也就是说,浅拷贝只是复制了对象的“顶层”,对于引用类型的成员,实际上复制的是引用,而不是引用所指向的对象。深拷贝(Deep Copy):创建一个新对象,不仅复制基本数据类型成员的值,对于引用数据类型的成员,也会为其创建新的对象,并复制其内容,使得新对象和原始对象完全独立,修改其中一个对象的引用类型成员不会影响到另一个对象。3.遵循 Java 的异常处理原则:对于可能出现异常的操作,按照良好的编程实践,应当声明可能抛出的异常,以便调用者能够进行适当的异常处理,增强程序的健壮性和可靠性。
2024-07-14 21:34:05
3942
原创 向上转型和向下转型(简单易懂)
在 Java 中,向上转型(Upcasting)是指将一个子类对象的引用赋值给一个父类类型的变量。语法格式:父类类型 对象名 = new 子类类型()在 Java 中,向下转型(Downcasting)是与向上转型相对的概念,向上转型是将子类对象的引用赋值给父类类型的变量,而向下转型则是将父类类型的引用强制转换为子类类型的引用。通俗来讲就是将一个子类对象向上转型之后可以当成父类对象使用,若需要调用子类特有的方法,则需要将父类对象再还原为子类对象。这就称作向下转型。
2024-07-12 21:24:51
3201
2
原创 Java继承关系(超详细)
在 Java 中,继承是面向对象编程的一个重要特性。继承允许一个类(称为子类或派生类)获取另一个类(称为父类或基类)的属性和方法。通过继承,子类可以复用父类的代码,并且可以在父类的基础上添加新的属性和方法,或者修改父类的方法实现(方法重写),继承使用extends关键字来实现。例如:这个代码就表示了cat类继承了animal类。
2024-07-11 22:51:06
1203
原创 Java异常 (很详细)
在 Java 中,异常是在程序运行期间发生的不正常情况或错误。就是自己定义的异常。第二张图片就是我自己写的一个自定义异常,里面的方法,你可以直接使用父类的,按着Ctrl点击那个RuntimeException出现了这个,根据需求选择可以直接使用的。我使用的是上面这两个,改一下名字就可以直接使用。Exception是RuntimeException的父类,为什么会报错呢?因为根据体系图我们可以知道,Exception包括运行时异常和非运行时的异常,非运行时的异常必须在运行之前就声明异常。
2024-07-11 16:04:12
3617
3
原创 String和String的一些方法
在使用编程语言处理问题时往往会遇到与字符串相关的问题,当如果我们想定义一个字符串类型,这在C语言中其实是不存在的,得使用char*p来表示我们想要表达的字符串,但这其实是一个char*类型的指针。而在Java当中存在一个全新的数据类型——String类型:它可以直接定义我们想要表示的字符串。他会直接打印出内容而不是像c语言一样打印出来地址,是因为String类型有Java虚拟机提供的toString的方法。注意:Java中的字符串结尾没有/0,字符数组才有。
2024-07-08 22:19:32
984
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人