自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 C++11 --- 智能指针详解

这样保障了资源的正常释放,避免资源泄漏问题。

2024-11-11 21:35:46 372

原创 C++初阶 --- 内联函数inline,正确且规范的宏

add函数被展开了,没有创建函数栈桢。

2024-11-05 21:14:25 258

原创 C++初阶 --- 命名空间

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。3. C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2024-11-05 17:18:08 267

原创 C++ --- 模板为什么不能分离编译?

编译后生成func.obj文件。最后在链接阶段时,链接器会根据两个.obj文件的符号表,发现func.obj文件中有与test.obj文件中对应的Add函数的符号,这时链接器就回为该函数分配地址,运行时就可根据该地址实现特定的功能。

2024-09-26 16:59:20 826

原创 C++ --- 静态多态和动态多态

静态多态和动态多态各有其优缺点,选择合适的多态形式应根据具体的应用场景和需求来决定。在需要高效、类型安全的场合,可以选择静态多态;在需要灵活性、易于扩展的场合,则可以选择动态多态。

2024-09-26 15:27:14 253

原创 C++进阶 --- 多继承中的虚表问题

A类、B类都有虚函数,C类继承了A、B类,然后重写了A、B类的虚函数,且C类也有自己的虚函数。

2024-09-19 16:55:38 238

原创 C++进阶 --- 多态及多态的原理

2.1 多态的构成条件多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。2.1.1 实现多态还有两个必须的条件(1)必须是父类的指针或者引用调用虚函数(2)被调用的函数必须是虚函数注意:要实现多态效果,第⼀,必须是父类的指针或引⽤,因为只有父类的指针或引⽤才能既指向本类对象又能指向子类的对象;第⼆,派⽣类必须对基类的虚函数重写/覆盖。

2024-09-18 17:29:03 857 1

原创 C++ --- std::array容器与std::vector容器的区别

在C++中,array和vector都是用于存储一系列相同类型元素的容器,但它们之间存在几个关键的区别。这些区别主要体现在内存管理、大小固定性、性能以及功能特性等方面。

2024-08-08 21:14:18 848 2

原创 C++ ---- vector的底层原理剖析及其实现

vector 是 C++ 标准模板库(Standard Template Library, STL)中的一个非常有用的容器。它是一个序列容器,可以存储具有相同数据类型的元素集合,这些元素在内存中连续存储。与数组相似,但 vector 提供了更多的灵活性和功能。主要特点:1.动态数组:vector 可以动态地增加或减少其大小,这意味着你可以根据需要存储更多的元素,而不需要担心数组越界的问题。2.随机访问:vector 支持随机访问,即你可以使用下标(索引)直接访问容器中的任何元素,其时间复杂度为 O(1)

2024-08-03 21:46:40 1226 3

原创 排序---归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2024-07-20 13:41:13 297 1

原创 operator new函数、operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

2024-07-17 22:13:54 252 1

原创 C++ --- 内存管理方式

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

2024-07-17 21:54:50 704 1

原创 C++ --- 初始化列表

在C++中,初始化列表(Initializer List)是构造函数的一个非常有用的特性,它允许在对象创建时直接初始化成员变量。这通常比先构造对象再调用成员函数设置成员变量的值更高效,尤其是对于那些非基本数据类型(如类类型)的成员变量来说,因为使用初始化列表可以避免不必要的拷贝或移动操作。因为a2需要先初始化,而a1还未初始化,a1的值为随机值,所以给a2初始化为a1的随机值。然后初始化a1,初始化为1。其中a1的值是1,a2的值是随机值。输出:1 , 随机值。

2024-07-15 22:11:57 307 1

原创 C++ --- 拷贝构造函数的细节

若未显式定义拷⻉构造,编译器会⽣成⾃动⽣成拷⻉构造函数。⾃动⽣成的拷⻉构造对内置类型成员变量会完成值拷⻉/浅拷⻉(⼀个字节⼀个字节的拷⻉),对⾃定义类型成员变量会调⽤他的拷⻉构造。像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的拷⻉构造就可以完成需要的拷⻉,所以不需要我们显⽰实现拷⻉构造。

2024-07-15 21:16:40 355 2

原创 C++ --- 类对象大小的计算

对象中没办法存储,这些指令存储在一个单独的区域(代码段),那么对象中非要存储的话,只能是成员函数的指针。Person 类实例化p1,p2两个对象,p1,p1都有各自的成员变量_age/_name/存储各自的数据,但是p1,p2的成员函数Init ()/Print() 指针却是一样的 ,存储在对象中就浪费了,因为如果Person类实例化了100个对象,那么成员函数指针就重复存储100次,太浪费了。• 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩。

2024-07-11 18:33:50 431 3

原创 C++ --- nullptr

f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换。C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的。使⽤nullptr定义空指针可以避免类型转换的问题,因为。,⽽不能被转换为整数类型。

2024-07-11 17:52:27 245 3

原创 C++初阶 ----- 引用、const引用

引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间。比如,西游记中“齐天大圣”,“弼马温”指的都是孙悟空。类型& 引⽤别名 = 引⽤对象;/ 引⽤:b和c是a的别名int& b = a;int& c = a;/ 也可以给别名b取别名,d相当于还是a的别名int& d = b;++d;return 0;由图中可知,d改变后a,b,c也改变了。

2024-07-10 17:31:40 373 3

原创 数据结构---二叉树

要注意的是满二叉树是一种特殊的完全二叉,简单的说,完全二叉树的最后一层的节点是不满的。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。最佳的方式就是用堆来解决,基本思路如下:。:大堆的根节点是该二叉树的最大节点,它的左右子树的值都小于根节点的值。以此类推,左右子树的根节点的值都大于该根节点的左右子树节点的值。:小堆的根节点是该二叉树的最小节点,它的左右子树的值都大于根节点的值。

2024-07-07 21:54:32 678

原创 带环链表问题及问题解决的底层原理剖析(下)

本题的解题方法仍是用快慢指针,当快慢指针在环内相遇时,用一个指针从相遇点开始走,一个指针从链表的头节点开始走,二者的相遇点就是环的入口点。

2024-05-08 17:27:28 201 5

原创 带环链表问题及问题解决的底层原理剖析(上)

题目链接:判断链表是否带环解:该题的解题思路是用快慢指针,快指针每走两步,慢指针走一步。若链表不存在环,那么快指针走到NULL就可以判断链表不存在环。若链表存在环,那么快指针和慢指针最终会在环内相遇,即slow==fast。详细过程如下:本文重点要探讨的不是该问题如何解决,而是研究解决该问题的方法的底层逻辑,即快慢指针为甚么能解决该问题,并且如果快指针一次走三步会怎样,一次走四步又会怎样,慢指针一次走两步、三步又会怎样…下面基于fast指针一次走两步,slow指针一次走一步来对问题进行探讨:

2024-05-06 20:13:53 295 1

原创 数据在内存中的存储与大小端字节序

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。为什么有⼤⼩端?

2024-03-29 16:59:43 915 2

原创 C语言进阶——动态内存管理

1.如果malloc函数或者calloc函数一开始开辟的内存空间(设为x吧)的后面仍然有足够的空间,那么realloc函数就直接在x后面接着开辟空间就行了(俩快空间是连续的),此时,realloc返回的是malloc所开辟的空间的起始地址,这时realloc就不需要复制原来的元素到新空间去了。假如我们需要存放30个字节的内容,那么所开辟的20个字节的空间显然是不够的,而假如我们只需要存放10个字节大小的内容,那么我们就浪费掉了10个字节的空间,该怎么解决整个问题呢?

2023-11-11 14:51:50 99 2

原创 结构体传参

结构体传参有俩种方法:传值和传地址。

2023-11-05 14:56:23 100 1

原创 判断矩阵是否为上三角矩阵(主对角线下方元素都为0)

【代码】判断矩阵是否为上三角矩阵(主对角线下方元素都为0)

2023-11-04 22:04:10 235 1

原创 三种方法模拟实现strlen函数

【代码】三种方法模拟实现strlen函数。

2023-10-30 16:03:20 60 1

原创 计算 1+1/(1-3)+1/(1-3+5)......1/(1-3+5.....2*n-1) 的和

【代码】计算 1+1/(1-3)+1/(1-3+5)......1/(1-3+5.....2*n-1) 的和。

2023-10-14 21:18:50 180 1

原创 模拟实现一个四则运算计算器(运算符优先级相同,即只能从左到右运算,且以‘=’为结束标记符)

【代码】模拟实现一个计算机(运算符优先级相同,即只能从左到右运算,且以‘=’为结束标记符)

2023-10-14 20:39:51 204 1

原创 用指针的方式将一个字符串中的每个单词倒序

即如:(i am student —> student am i)

2023-10-11 23:07:38 468

原创 局部变量与全局变量之间的一些易错点

在function函数内部的n为局部变量,而当局部变量的名字与全局变量的名字一样时,优先使用局部变量,故n+=1中的n是局部变量n,此时局部变量n==3,而当局部变量出了函数内部后不能再使用,故在main函数内部打印的n是全局变量n,为1。

2023-10-08 10:57:44 75 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除