自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux数据库:【数据库基础】【库的操作】【表的操作】

数据库是一个用于存储和管理数据的系统。它可以帮助用户组织、检索、更新和管理大量数据。mysql是数据库服务的客户端,mysqld是数据库服务的服务端,它的本质就是基于CS模式的网络服务。文件保存数据有以下几个缺点:文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便比如我们在一个普通文件里写入大量的数据(十万行十亿行),那么多的数据在普通文件里,我们如果想要管理起来这是非常麻烦的一件事,比如我要修改十亿行数据里的第一百万行,怎么搞?

2025-04-06 00:00:00 775

原创 Linux线程同步与互斥:【线程互斥】【线程同步】【线程池】

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区, 平衡了生产者和消费者的处理能力。因为我在当前的进程没有进行释放锁的操作,我是持有锁被切换的,相当于拿着钥匙,钥匙不给其他线程,其他线程也只能干等着,等我回来释放锁,其他线程才能展开锁的竞争,进入临界区。• 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完 成线程之间的交互。

2025-04-05 00:00:00 984

原创 Linux线程概念与控制:【线程概念(页表)】【Linux线程控制】【线程ID及进程地址空间布局】【线程封装】

• 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”• 一切进程至少都有一个执行线程• 线程在进程内部运行,本质是在进程地址空间内运行• 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化• 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形 成了线程执行流。

2025-04-04 00:00:00 716

原创 Linux进程信号:【什么是信号】【产生信号】【保存信号】【捕捉信号】【可重入函数】【volatile】【SIGGHLD】

闹钟响了,上课铃响了,肚子饿了。这些都是给人的信号,人可以接收这些信号,从而去处理信号。信号的三种处理方式:默认处理动作(我饿了,立刻就去吃饭),自定义处理信号(我饿了,先打完这把游戏再吃),忽略信号(我饿了,但我现在就是不吃)。你怎么能识别信号呢?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。信号产生之后,你知道怎么处理吗?知道。如果信号没有产生,你知道怎么处理信号吗?知道。所以,信号的处理方法,在信号产生之前,已经准备好了。处理信号,立即处理吗?

2025-04-03 00:00:00 898

原创 Linux进程间通信:【目的】【管道】【匿名管道】【命名管道】【System V 共享内存】

第二次循环,再次创建管道文件,因为父进程的3已经被关闭了,所以重新分配的话会分配3和5,后面依然会关闭3,此时就要创建新的子进程了,那么这个子进程有了上面的经验,这个子进程就会进程父进程所有的东西,包括上面父进程的4。上面的方法并不好,虽然解决了问题,这里我们希望只让父进程的写端指向我们的文件,所以我们在每一次的创建新的子进程的时候,让子进程把它的兄弟进程的写端给关掉,根本不增加引用计数的机会。在创建子进程的时候,子进程会继承父进程的文件描述符表,所以子进程的文件描述符表需要关闭写端,父进程需要关闭读端。

2025-04-02 00:00:00 1299

原创 Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:• 静态库 .a[Linux]、.lib[windows]• 动态库 .so[Linux]、.dll[windows]预备代码,第三节:简单封装的libc库• 静态链接的出现,提高了程序的模块化水平。对于一个大的项目,不同的人可以独立地测试和开发自己的模块。

2025-02-11 15:36:55 807

原创 Linux Ext系列文件系统:【理解硬件(磁盘)】【引入文件系统】【ext2文件系统】【软硬链接】

目录一、理解硬件(磁盘)1.1磁盘的存储结构 1.2磁盘的逻辑结构1.3CHS与LBA地址转换二、引入文件系统2.1块​编辑 2.2分区2.3inode三、ext2文件系统 3.1宏观认识 3.2Block Group3.3块组内部构成3.3.1超级块(Super Block)3.3.2GDT(Group Descriptor Table)3.3.3块位图(Block Bitmap)3.3.4inode位图(Inode Bitmap)3.3.5节点表(Inode Table)3.3.6Data B

2025-02-08 12:07:15 756

原创 Linux基础IO【系统文件I/O】【理解“一切皆文件”】【缓冲区】

pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1缓冲区是内存空间的一部分。

2025-02-06 13:46:39 963

原创 Linux进程控制:【进程创建】【进程终止】【进程等待】【进程程序替换】【自主shell命令行解释器】

程序替换是通过特定的接口,加载磁盘上的一个全新的程序(代码和数据),加载到调用进程的地址空间 中!我们知道,进程在被杀死后就会进入僵尸状态,在task_struct内部会记录我们此时的退出状态和信号信息等,父进程进行系统调用(wait)找到子进程,把信息按位操作通过status交到父进程所对应的地址空间上。5.光返回0还不够,我们需要在父进程的外部加一个循环(非阻塞轮询),使得父进程的waitpid隔一段时间就查一下,而隔一段的这个时间,父进程就可以干自己的事情,具体怎么干,参考上面的代码。

2025-02-01 21:11:37 702

原创 Linux进程概念:【环境变量】【程序地址空间】

◦ 众所周知,编译完成后的程序是存放在硬盘上的,当运行的时候,需要将程序搬到内存当中去运行,如果直接使用物理地址的话,我们无法确定内存现在使用到哪里了,也就是说拷贝的实际内存地址每一次运行都是不确定的,比如:第一次执行a.out时候,内存当中一个进程都没有运行,所以搬移到内存地址是0x00000000,但是第二次的时候,内存已经有10个进程在运行了,那执行a.out的时候,内存地址就不一定了。• 因为有地址空间的存在和表表的映射的存在,我们的物理内存中可以对未来的数据进行任意位置 的加载!

2025-01-26 14:41:53 914

原创 Linux初识:【冯诺依曼体系结构】【操作系统概念】【进程部分概念(进程状态)(进程优先级)(进程调度队列)】

假如磁盘写这100MB的内存失败了,磁盘就会去找进程,但是进程已经死亡了,无法找到进程,此时磁盘也不知道怎么办了,这100MB的东西就丢失了。因为进程在启动时会记录下来当前路径,而fopen就是进程中的一句代码,fopen在创建文件的时候,会默认的获取工作路径,在路径后面加上我们新建的代码。这个exe就是我们对应的可执行文件,当进程在跑的时候我们甚至可以把这个文件删除也不会影响我们正在跑的进程,因为删除的这个文件已经被执行了,上面说过的一个东西程序被执行就一定要先加载到内存,我们删除的只是磁盘上的文件。

2025-01-24 13:58:05 885

原创 Linux初识:【版本控制器Git】【调试器gdb/cgdb使用】

所谓的版本控制器,就是能让你 了解到一个文件的历史,以及它的发展过程的系统。通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。程序的发布方式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的二进制程 序,默认是 release 模式。当我们在上面用Windows机器对文件进行了修改更新了远端仓库的内容,那我的Linux机器并不知道远端更新了,这时如果我去。它会记录我们所有的修改记录,git在提交的时候只会记录变化的部分。

2025-01-20 17:25:21 847

原创 Linux初识:【make/Makefile】【进度条】

从上到下扫描,刚开始是没有.o文件的,理解为先把这段指令入栈,往下执行,也没有.s文件,也入栈,以此类推一直到.i所依赖的.c文件,执行这段代码,生成.i文件,一直往上走。5.当然,你的C文件和H文件是存在的,于是make会生成myproc.o文件,然后再用myproc.o文件声明make的终极任务,也就是执行文件。7.在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

2025-01-19 16:59:50 713

原创 Linux初识:【Linux软件包管理器yum】【Linux编辑器-vim的使用】【Linux编译器-gcc/g++的使用】

在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.软件包和软件包管理器,就好比"App"和"应用商店"这样的关系.

2025-01-18 16:34:17 1298

原创 Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提 亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫 它王婆,它对应我们常使用的bash。那么我就必须开放权限给组长,如果只有文件拥有者和other的话,我开放权限就只能开放other的权限,那么其他所有人是不是都可以看见了,为了避免这样的情况发生,就专门设置了一个叫做所属组的东西,使开权限只让所属组看到。在特殊情况下,配置umask可以控制文件的默认权限,让我们的代码是可控的。

2025-01-15 16:07:15 961

原创 Linux初阶:【在Linux系统中,一切皆文件】【文件类型】【部分指令】

我们是设备在启动的时候默认会打开三个设备文件,这三个文件会以FILE*的形式给我们呈现出来,让我们去访问对应的文件。跟Windows差不多,我们在进行文件传输时,为了节省传输的时间,我们通常会对文件进行压缩处理,然后再去进行文件传输。我在echo命令的后面加一个“>”符号,就说明我要把这个字符串写到hello.txt文件里,而不再是默认的显示器文件里。head查看开始的,tail查看最后的。在不同的终端用echo重定向输出字符串到另一个终端里,这充分可以证明终端也是文件 (每一次我们登录就是新建文件)。

2025-01-14 14:49:19 1036

原创 Linux初识:搭建环境,Xshell远程登录

1. 直接安装在物理机上. 但是由于 Linux 桌面使用起来非常不友好, 不推荐.2. 使用虚拟机软件, 将 Linux 搭建在虚拟机上. 但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上出现各种莫名其妙的问题, 比较折腾.3. 使用云服务器, 可以直接在 腾讯云, 阿里云或华为云 等服务器厂商处直接购买一个云服务器.这里对于新手推荐直接购买云服务器,好用也好实现。以阿里云为例:可以自行选择。

2025-01-12 17:07:16 316

原创 C++进阶:异常

• 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的一部分负责检测问题的出现,然后解决问题的任务传递给程序的另一部分,检测环节无须知道问题的处理模块的所有细节。上面的代码就是在除以0时抛出异常,但是抛出异常后在Func函数里有资源需要释放,但是捕捉异常的特性就是直接跳到catch位置,这里的资源没法释放就会资源泄漏,所以这里我们套一个catch捕捉异常,先把资源释放掉再去throw抛异常,外部再去捕捉。

2025-01-12 14:28:32 1047

原创 C++11:【包装器】【智能指针】

weak_ptr支持expired检查指向的 资源是否过期,use_count也可获取shared_ptr的引用计数,weak_ptr想访问资源时,可以调用lock返回一个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是一个空对象,如 果资源没有释放,则通过返回的shared_ptr访问资源是安全的。RAII在获取资源时把资源委托给一个对象,接着控制对资源的访问, 资源在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源,这样保障了资源的正常释放,避免资源泄漏问题。

2025-01-12 14:28:09 1095

原创 C++11:【可变参数模版】【移动构造和移动赋值】【lambda】

• 仿函数的类名是编译按一定规则生成的,保证不同的 lambda 生成的类名不同,lambda参数/返 回类型/函数体就是仿函数operator()的参数/返回类型/函数体, lambda 的捕捉列表本质是生成的仿函数类的成员变量,也就是说捕捉列表的变量都是 lambda 类构造函数的实参,当然隐式捕捉,编译器要看使用哪些就传那些对象。当使用混合捕捉时,第一个元素必须是&或=,并且&混合捕捉时,后面的捕捉变量必须是值捕捉,同理=混合捕捉时,后面的捕捉变量必须是引用捕捉。捕捉列表为空也不能省略。

2024-12-10 21:46:28 711

原创 C++11:【列表初始化】【右值引用和移动语义】

• Function(T&&t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模 板参数T的推导int&,再结合引用折叠规则,就实现了实参是左值,实例化出左值引用版本形参的 Function,实参是右值,实例化出右值引用版本形参的Function。•变量表达式都是左值属性,也就意味着一个右值被右值引用绑定后,右值引用变量表达式的属性是左值,也就是说Function函数中t的属性是左值,那么我们把t传递给下一层函数Fun,那么匹配的都是左值引用版本的Fun函数。

2024-12-03 17:45:37 592

原创 C++进阶:用哈希表封装unordered_map和unordered_set

• 通过源码可以看到,结构上hash_map和hash_set跟map和set的完 全类似,复用同⼀个hashtable实现key和key/value结构,hash_set传给hash_table的是两个 key,hash_map传给hash_table的是pair<const Key,Value>。• iterator实现的大框架跟list的iterator思路是一致的,用一个类型封装结点的指针,再通过重载运算符实现,迭代器像指针一样访问的行为,要注意的是哈希表的迭代器是单向迭代器。

2024-11-23 16:11:38 642

原创 C++进阶:哈希表实现

当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。如果是2^x ,那么key%2^x本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。

2024-11-21 22:54:44 1043

原创 C++进阶:unordered_map和unordered_set的使用

• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数• unordered_set默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数• unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。

2024-11-05 23:04:24 677

原创 C++进阶:封装红黑树实现map和set

RBTree实现了泛型不知道T参数导致是K,还是pair,那么insert内部进行插入逻辑比较时,就没办法进行比较,因为pair的默认支持的是key和value一起参与比较,我们需要时的任何时候只比较key,所以我们在map和set层分别实现一个MapKeyOfT和SetKeyOfT的仿函数传给 RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进行比较,具体细节参考如下代码实现。如果右子树为空,就需要往上找了,找的是孩子是父亲左的那个祖先。

2024-11-02 13:56:11 956

原创 C++高阶:红黑树实现

分析:因为p和u都是红色,g是黑色,把p和u变黑,左边子树路径各增加⼀个黑色结点,g再变红,相 当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题,需要继续往上更新是因为,g是红色,如果g的父亲还是红色,那么就还需要继续处理;u不存在,则c一定是新增结点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。分析:p必须变黑,才能解决,连续红色结点的问题,u不存在或者是黑色的,这里单纯的变色无法解决问题,需要旋转+变色。

2024-10-20 21:49:31 1000

原创 C++进阶:AVL树实现

• 更新后parent的平衡因子等于2或-2,更新前更新中parent的平衡因子变化为1->2或者-1->-2,说 明更新前parent子树一边高一边低,新增的插入结点在高的那边,parent所在的子树高的那边更高 了,破坏了平衡,parent所在的子树不符合平衡要求,需要旋转处理,旋转的目标有两个:1、把 parent子树旋转平衡。• 在a子树中插入一个新结点,导致a子树的高度从h变成h+1,不断向上更新平衡因子,导致10的平 衡因子从-1变成-2,10为根的树左右高度差超过1,违反平衡规则。

2024-10-19 21:04:08 1020

原创 C++进阶:map和set的使用

• set的声明如下,T就是set底层关键字的类型• set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。• 一般情况下,我们都不需要传后两个模版参数。• set底层是用红黑树实现,增删查效率是O(logN) ,迭代器遍历是走的搜索树的中序,所以是有序 的。

2024-10-15 21:36:53 962

原创 C++进阶:二叉搜索树

找N左子树的值最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的 位置,都满足二叉搜索树的规则。• 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,map/set/multimap/multiset系列容器底层就是二叉搜索树,其中map/set不支持插入相等值,multimap/multiset支持插入相等值。3. 如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。

2024-10-10 22:48:05 1091

原创 C++进阶:多态

多态是⼀个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。需要满足:• 必须指针或者引用调用虚函数• 被调用的函数必须是虚函数。说明:要实现多态效果,第一必须是基类的指针或引用,因为只有基类的指针或引用才能既指向派生类对象;第二派生类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派生类才能有不同的函数,多态的不同形态效果才能达到。

2024-10-04 16:48:36 1076

原创 C++进阶:继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。假如我有两个类Student和Teacher,这两个类可能有些属性是相同的,比如它们都有名字,性别等等,但是它们也有一些特点是独有的,比如学生的学号,老师的职工号等等。

2024-08-13 16:32:53 1120 1

原创 C++初阶:模版进阶【非类型模版参数】【模版的特化】【模版分离编译】

模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常 量来使用。创建一个a1.注意:1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。

2024-08-10 21:00:20 827

原创 C++初阶:【优先级队列】【容器适配器】【deque】【栈和队列】

priority_queue文档介绍(1)优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。(2)类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。(3)优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。(4)底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

2024-08-09 18:39:21 881

原创 C++初阶:list的使用和模拟实现

list实际上就是链表,是带头双向循环链表。

2024-08-02 19:11:40 1249 1

原创 vector迭代器失效问题

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对 指针进行了封装。比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器 底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。

2024-07-31 16:14:42 658 1

原创 初识C++: string类【标准库里的string】【string类的模拟实现】

关于string类,可以先看一下这个文档。

2024-07-29 21:31:22 892 5

原创 C++初阶:内存管理

int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间//还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;

2024-07-21 20:53:43 897

原创 C++初阶:模版初阶【范式编程】【函数模板】【类模板】

/ 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误// 扩容++_size;

2024-07-20 19:58:39 351

原创 C++初阶:类和对象(下)【再探构造函数】【类型转换】【static成员】【友元函数】【内部类】【匿名对象】

(1)之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟⼀个放在括号中的初始值或表达式。public里就是初始化列表。(2)每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。因为初始化列表被认为是成员变量初始化定义的地方,且成员变量只能定义一次,所以成员变量只能出现一次。(3)

2024-07-15 20:27:39 913

原创 C++初阶:类和对象(中)【类的默认成员函数】【构造函数】【析构函数】【拷贝构造函数】【赋值运算符重载】【取地址运算符重载】

默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数。

2024-07-14 18:38:10 782

空空如也

空空如也

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

TA关注的人

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