- 博客(27)
- 收藏
- 关注
原创 Git 学习与使用
⼯作区:是在电脑上你要写代码或⽂件的⽬录。暂存区:英⽂叫stage或index。⼀般存放在.git ⽬录下的index⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。版本库:⼜名仓库,英⽂名 repository。⼯作区有⼀个隐藏⽬录.git ,它不算⼯作区,⽽是Git的版本库。这个版本库⾥⾯的所有⽂件都可以被Git管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
2024-09-06 09:32:51 479
原创 protobuf 入门学习
在安装protobuf时会使用到一些依赖库,如果没有安装就先执行下面的命令centos下根据自己的语言下载或者选择all.zip支持全部语言进入到下载的目录下# 第⼀步执⾏autogen.sh,但如果下载的是具体的某⼀⻔语⾔,不需要执⾏这⼀步。# 第⼆步执⾏configure,有两种执⾏⽅式,任选其⼀即可,如下:# 1、protobuf默认安装在 /usr/local ⽬录,lib、bin都是分散的# 2、修改安装⽬录,统⼀安装在/usr/local/protobuf下。
2024-08-28 10:27:57 12
原创 红黑树原理 部分模拟实现
enum colorRED,BLACK//父节点指针//节点的值域color _col;//颜色_kv(kv),_col(RED) //初始颜色为红色{}
2024-06-28 10:37:23 823
原创 C++ 模板高阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-06-23 21:00:13 519
原创 CPP-类对象大小的组成
实际上由于同一个类的每个对象中只有变量不一样,而函数代码都是一样的,所以没有必要每个对象都存一份函数代码。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。要计算一个类对象的大小要先明白一个问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
2024-06-23 18:51:27 228
原创 C++ 右值引用
什么是左值?什么是左值引用?左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。什么是右值?什么是右值引用?右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。
2024-04-21 11:35:21 291
原创 C++ 深入理解 多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数。2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。虚函数重写的两个例外:1. 协变(基类与派生类虚函数返回值类型不同)
2024-04-21 10:28:16 913 1
原创 C++ 深入理解 继承
本篇文章将谈谈一下几个问题:1.基类和派生类对象赋值转换2.继承中的作用域3.派生类的默认成员函数4.复杂的菱形继承及菱形虚拟继承5.其他。
2024-04-20 23:08:32 589
原创 Linux 共享内存 及 利用管道实现简单协同
第二部要创建共享内存,参数分别是key(上边ftok生成的key)size(共享内存的大小,推荐4KB)第三个参数是打开方式(如果你是创建就IPC_CREAT | IPC_EXCL,如果你是打开共享内存就IPC_CREAT)。第三部关联共享内存(第一个参数传入shmget的反回值,第二个参数传nullptr表示系统帮你选择一块地址空间,第三个参数传0表示默认以读写方式打开,返回值是这块空间的起始地址,默认大小是shmget传的size)这些共享的内存区域可以被多个进程访问,从而实现对进程间数据的快速交换。
2024-04-20 17:56:01 675
原创 cpp智能指针详解+简单模拟实现
有多个指针指向同一分内存时就要考虑使用shared_ptr了,shared_ptr的本质是采用引用计数的方式来记录有多少个指针指向这份空间,当发生拷贝或赋值时引用计数就++,shared_ptr析构时引用计数就--,只用当引用计数为0时才会释放空间。unique_ptr不允许复制和拷贝(可以移动构造和移动赋值)本质上就是一个unique_ptr管理一个内存空间(如果是多个指针指向同一份内存要用后面的shared_ptr)。由于它的构造和析构不会引起引用记数的增加或减少所以完美解决了循环引用的问题。
2024-04-18 11:42:57 224 1
原创 c++代码模拟实现qt对象树机制
object对象最先调用析构函数,遍历其容器,deleteA对象然后A对象调用其析构函数,遍历到B对象然后B对象调用其析构函数无对象在其容器自此所有对象全部被释放。在qt中当父对象被销毁时,它会自动销毁所有子对象。下面我将用代码简单模拟一下对象树的原理。注意:虽然A对象先调用析构函数但是实际上A对象要等到B对象的生命周期结束之后A对象的生命周期才算结束。我们发现此时在A对象中new出来的B对象并没有被释放,导致内存泄漏了。下面我将对刚才的代码进行一部分的修改。上,这样便形成了一颗简单的对象树。
2024-01-06 11:40:38 388 3
原创 C++引用(起别名)
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。所以引用做函数参数时没有临时拷贝可以提高效率。其实在底层上来说引用是按照指针方式来实现的。但是sizeof(引用)的大小是引用类型的大小而sizeof(指针)的大小是4/8个字节。而且不存在二级引用的说法。
2023-10-16 14:22:49 328 5
原创 不用+号算加法(位运算实现)
在不能使用 + 号的情况下其实很容易想到运用位运算去解决问题,也就是用二进制去表示十进制加法的逻辑。所以我们可以先拆分十进制加法来帮助理解。最近在LeetCode上刷题看到一道非常有意思的题,如何不用+号算加法?我觉得挺有意思的故而分享给大家。(因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位),然后计算进位 5+7。,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。十进制相加思想:例如 15+07 , 先计算不考虑进位的。当进位为0时结束计算。
2023-08-18 10:12:03 396 26
原创 C语言 与 C++ 通讯录对比实现(附源码)
在C++版里我们总共用的新的概念有:类,vector,运算符重载,范围for循环,迭代器,内联函数等等。C++源码:test.cpp// 菜单//枚举选项Exit,add,del,Search,modify,Sort,Printint main()int input;do {menu();cout
2023-07-17 11:49:26 483 29
原创 C++ 继承与多态的基本用法
所谓动态其实就是在程序运行的时候(运行到调用fun函数这行代码时)才能知道调用的是哪个子类的fun函数,虚函数因为是在程序运行的时候才知道调用的是哪个虚函数,所以虚函数必须写它的定义部分(以备编译器随时调用)。在C++继承中,子类会遮蔽父类中的同名函数,无论此函数的返回值,参数。也就是说父类和子类中的函数只要名字相同,子类中的函数就会遮蔽掉父类中的同名函数。通过继承父类中有很多成员变量和成员函数就自动继承到了子类中,那么在书写子类的时候就减少了很多代码工作量——只用写子类独有的一些内容即可。
2023-07-14 10:33:28 210 17
原创 C++析构函数与深,浅拷贝
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。因为我们拷贝的对象与原对象动态开辟的元素共用了一段内存。深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。析构函数与构造函数是相对的,或者说是相反的,定义对象时系统会调用构造函数,对象销毁时系统会调用析构函数。
2023-07-13 19:41:47 217 7
原创 C语言—模拟实现memcpy,memmove
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。//前->后else//后->前return ret;注意当dest
2023-07-12 12:55:02 620 11
原创 C++构造函数与拷贝构造函数
在类中有一种特殊的成员函数,它的名字与类名相同,在创建类对象时,这个特殊的成员函数会被系统自动调用,这个函数就叫拷贝构造函数。可以简单理解为构造函数的意义就是初始化类内对象的成员变量。注意构造函数无返回值,一个类中允许多个构造函数的存在。虽然一个类中允许多个构造函数的存在但是要让编译器区分不同构造函数的区别,否则会报错。上面的代码就不允许同时存在。上面代码其实调用的是拷贝构造函数。下面马上来讲解拷贝构造函数。
2023-07-12 11:12:06 284 4
原创 C++ string类型的基本使用方法
/C语言//C++string s1;//默认初始化,s1代表一个空串//与string s2 = “csdn”;等价//初始化一个连续num个字符‘a’组成的字符串还有复制初始化下面会讲到。
2023-07-11 11:35:28 428 16
原创 C语言-数据的存储(二进制形式)
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。例如图中int a = 1(十六进制表示)底地址 高地址01000000。
2023-06-02 18:33:32 1217 19
原创 学习按位与,按位或,按位异或
感觉对于初学者来说这是一个偏僻的知识点但非常的重要,要想未来能顺利的学习高级知识现在就必须打好坚实的基础!一道变态的面试题: 不能创建临时变量(第三个变量),实现两个数的交换。当然位运算符的作用远不止于此,这里我就不过多介绍了。又是一个愉快的周末,闲来无事的我又打开了我们充满爱与美好的CSDN。:两个二进制序列同一位上的数字相同则为0,不同则为1。:两个二进制序列同一位上都为1则为1,否则为0。:两个二进制序列同一位上有1则为1,否则为0。
2023-05-12 21:41:44 146 6
原创 C语言-函数的基本用法
/(函数返回值类型) (函数名) (参数类型 a,参数类型 b,...)//{//实现一些功能的代码;//返回函数;//}//把a+b的值返回给函数(sum = a + b)//把a+b的值返回给函数(sum = a + b)int main()int a,b;a = b =1;return 0;也可以写成这样:现声明后定义int main()int a,b;a = b =1;return 0;关于函数的参数(形参)建议学完指针再做进一步了解。
2023-05-01 10:59:18 144 19
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人