自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 条款14:在资源管理类中小心拷贝行为

像shared_ptr,每次拷贝的时候引用技术+1,析构的时候-1,引用计数为0时删除对象。如果你是一个资源管理类的作者,那么一定会面对一个问题,RAII在被赋值的时候会发生什么?就像lock_gurad,管理锁的一个类,他的拷贝构造是被禁止的。涉及到智能指针,那拷贝的资源一定需要进行深拷贝。移动所有权之后ptr变为nullptr。有四种解决方案供你选择。像unique_ptr。4.转移资源的所有权。

2025-04-18 18:00:51 135

原创 条款13:以对象管理资源

当然现在auto_ptr已经被淘汰了,C++11之后 unique_ptr完全代替了auto_ptr,unique_ptr 不仅支持指向数组,还支持自定义删除器都是auto_ptr不具备的,而且 c++17之后auto_ptr被完全删除。如果你的delete语句在循环中,遇到goto 和 break之后你的pI还能不能被释放?没错但是内存只是我们需要管理众多资源的一种,资源还包括数据的连接,文件描述符,互斥锁,网络套接字,不管哪种资源他都是从系统中获取的,当你不在需要他的时候是要还给系统的。

2025-04-18 17:42:36 191

原创 条款12:复制对象时勿忘其每一个一个成分

如果你声明自己的拷贝函数,再你增加成员变量的时候,不要忘记修改拷贝函数,因为即使你忘记再你的拷贝函数中添加新的成员变量,编译器并不会报错,在vs2022中会存在警告。一个好的面向对象系统会将内部封装起来,只留两个函数负责拷贝,在必要的时候编译器会自动为我们生成拷贝函数,这些编译默认生成的拷贝函数的行为就是将类的成员全部拷贝一份。这个拷贝函数看着没啥问题,实则问题大了,那我问你 你的基类成分去哪了?你的基类成分难道不需要拷贝吗?如果忘记在拷贝构造中添加date 会出现一个警告,但是拷贝赋值不会出现警告。

2025-04-18 16:45:06 177

原创 条款11:再operator=处理自我赋值

可能客户并不会这么愚蠢写出这样的代码,但是有一些自我赋值不是那么容易发现的。但是这并不是最优的做法,增加一个控制流会减缓一些指令的执行速度。看这段代码如果是自我赋值就惨了, 先把自己给删除了。利用传值拷贝构造一个新的对象,再交换成员变量。可以添加一个证同测试。

2025-04-18 09:25:50 181

原创 条款10:令operator=返回一个reference to *this

这个只是一个协定,如果你没有更好的理由,还是要遵守这个协定,像内置类型看齐。这么做是为了支持,像内置类型那样进行连锁赋值。

2025-04-18 08:56:34 82

原创 条款09:不要再构造函数和析构函数中调用虚函数

在构造和析构函数中调用虚函数,本身就是一个错误的行为,这样调用不会带来你想要的结果。

2025-04-18 08:48:51 141

原创 条款08:别让异常逃离析构函数

C++并不禁止析构函数抛出异常,但是不鼓励你去这么做在doSomething执行完毕,v会销毁调用 widget的析构函数,如果析构函数出现异常,假设v有10个 widget对象,那么就会连抛10个异常,上个异常可能还没处理完,再抛异常程序会调用std::terminate()直接终止程序。如果你的析构函数需要执行一个动作,但是这个动作可能抛出异常怎么办?

2025-04-17 20:23:39 193

原创 条款07:为多态基类声明一个virtual析构函数

就出现大问题了,当delete一个对象时,会调用其析构函数,但是ptk指向的是一个派生类对象,delete ptk;只会调用 ~Timekeeper(),而派生类部分仍然存在,这个时候就会出现一个,销毁了一半的怪物。virtual不是胡乱加的,如果一个类成员是 两个整形的变量,那么这个类的大小是64bit,如果你添加了一个虚函数,在类空间的起始位置会添加一个虚表指针,如果是32位的机器类的大小是96bit,如果是64位机器类的大小来到了128bit。客户使用你的代码时,只想使用时间,不关系是如何计时的。

2025-04-17 19:45:30 219

原创 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

protect:private:编译自动生成的拷贝构造,会去先调用基类的拷贝构造,但是基类拷贝构造在派生类是无法访问的,这样编译器就无法默认生成了。

2025-04-17 17:40:32 235

原创 条款05:了解C++默默编写并调用哪些函数

当成员函数有引用 或者 被const修饰,编译器是不会自动生成 operator= 的,因为 &必须在定义的时候初始化,而且初始化之后不可以进行修改,const也同样,这个时候需要程序员手动写operator=。operator=被声明为私有,派生类生成的默认operator=回去先调用基类类的operator=,但是没有权限,编译器也无能为力。如果程序员不去写这些函数 ,他们会在被调用的时候由编译器生成。这些默认生成的函数都是public和inline。

2025-04-17 17:15:22 307

原创 条款04:确定对象被使用之前已经被初始化

一定要使用构造函数初始化列表,而不是在构造函数的函数体内赋值。private:// 不要这样private:成员初始化的顺序,就是类内声明的顺序。当一个成员变量初始化,需要用到另一个成员变量,要保证初始化的次序。例:array数组初始需要大小,在array初始化之前 保证表示大小的那个成员已经初始化完毕。

2025-04-17 15:30:45 196

原创 条款03:尽可能多使用const

非const类型的指针 对应 iterator, const 类型的指针对应 const_iterator.当然这种做法需要借助 mutable关键字来释放,非静态成员变量的位常量性,是其支持逻辑常量性。这种说法主张,在const成员函数中某些变量是可以被修改的,但这些修改一定是不可见。const 放在 * 号的左边是修饰指向的内容, 放在* 右边是修饰指针本身。注意:如果成员变量中含有指针,那么这个这个指针指向的内容是可被修改的。这种说法主张的是const成员函数的任何一个比特位都是不可以修改。

2025-04-17 14:28:06 315

原创 条款02:尽量以const,enum,inline代替#define

定义const指针时,别忘了指针指向的内容也是不可更改的,所以要在*号的后面加个const。private:首先#define不提供任何的封装所以无法作为类的专属变量。在定义 static const int NumTurns = 5;时如果你的编译不支持在类内进行初始化,可以使用匿名枚举(enum hack)或者 类内定义类外初始化。

2025-04-17 11:44:03 283

原创 git:5步搞定向远程仓库提交

【代码】git:5步搞定向远程仓库提交。

2025-03-01 19:37:26 430

原创 git:分支控制

master主分支:主分支,master分支上的代码通常是部署在生产环境中的,通常是稳定的代码,不会再主分支上进行任何的开发操作,写出个bug那服务就直接挂了就惨了。通常进行开发的时候通常会创建一个分支,在分支上开发,对分支修改不会影响主分支,如果代码没问题,再将分支合并到主分支。

2025-03-01 09:27:27 950

原创 https:原理

中间人攻击最主要的就是没有办法去甄别客户端收到的公钥是否是被篡改过了,解决了这个问题,自然就解决了中间人攻击。https引入了CA证书解决去解决这个问题,CA证书是需要去CA认证的机构去申请的。申请的时候需要提供公司的信息,网站的域名,申请人,最重要的服务器的公钥。CA证书主要构成,一段明文数据 + 签名(对数据指纹进行加密)。签名:就是对这段明文数据描述的数据指纹进行了加密。加密是用的是CA机构的私钥加密。

2025-02-25 19:50:51 1030

原创 QT:Button

QPushButton类继承于QAbstractButton类,需要先了解QAbstractButton有那些成员属性。QPushButton继承于QWidget类。QPushButton派生了一下这些类。QAbstractButton有以下属性。

2025-02-13 13:28:52 843

原创 websocketpp库使用:快速搭建一个websocket服务端

在需要实时更新数据的场景下,如在线聊天、实时股票行情显示等,客户端为了获取最新信息,不得不频繁地向服务器发送请求,这种方式会造成大量不必要的网络流量和服务器负载,同时也无法保证数据的实时性。常见的操作码包括 0x0(延续帧)、0x1(文本帧)、0x2(二进制帧)、0x8(关闭帧)、0x9(Ping 帧)和 0xA(Pong 帧)。服务器收到客户端的升级请求后,如果同意升级,会返回一个状态码为 101 的响应,并包含相应的报头信息。客户端发送的帧必须进行掩码处理,服务器发送的帧不能进行掩码处理。

2025-02-12 11:17:12 1091

原创 QT:QWidget

QT中的所有控件都继承于QWidget这个类,学习QWidget这个类的接口和属性对于控件的学习是非常重要的。创建好项目打开qt designer,就可以看到QWidget的所有属性,这里只挑常用的介绍。

2025-02-10 10:15:47 849

原创 QT:信号和槽

1.在头文件 widget类声明槽函数private slots: //slots是qt特有的关键字2.在 widget.cpp中定义槽函数this->setWindowTitle("标题1");3.与信号绑定后运行button->setText("按钮");按下按钮后窗口的标题就会变为标题1自定义信号,不需要有函数体直接声明即可。自定义的信号,只能使用emit关键字手动发射信号,其实emit加不加都可以,只是为了可读性罢了。1.声明一个信号signals:2.信号的实现。

2025-02-05 21:40:39 795

原创 QT:对象树

Qt 中的对象树是一种以树形结构组织 Qt 对象的方式。当创建一个QObject(Qt 中大多数类的基类)或其派生类的对象时,可以为其指定一个父对象(parent这个对象就会被添加到其父对象的子对象列表中,形成一个树形结构。当父对象被销毁时,它会自动销毁其所有的子对象。对象树是qt内存管理的核心机制,非常的重要。

2025-02-05 16:52:38 475

原创 docker:容器化虚拟化的原理

docker可以分为镜像,容器和仓库。镜像(Image):Docker 镜像是一个只读的模板,它包含了运行一个特定应用程序或服务所需的所有文件系统内容,包括操作系统、应用程序代码、依赖库和配置文件等。镜像是创建容器的基础。容器(Container):容器是基于镜像创建的可运行实例,它是一个独立的、轻量级的运行环境,容器之间相互隔离,互不影响。每个容器都可以看作是一个独立的微型服务器,能够在不同的主机上运行。仓库(Repository)

2025-01-24 19:08:20 1337 1

原创 docker:互联网架构的演进

在互联网诞生的初期只有少量的人能够上网,将服务部署在一台主机上就足够支持客户的访问,但是对着互联的发展使用人数 激增,单机架构已经承受不住大量的用户并发访问,为了解决这个问题架构开始不断的演进。

2025-01-21 10:38:39 1013

原创 MySQl:使用C语言连接数据库

在我们下载mysql时其实已经下好了mysql各种开发的头文件和库文件。我使用的机器时ubuntu20。

2025-01-19 11:07:30 413

原创 动态规划:子数组问题

综上所诉f[i] = max(nums[i], f[i-1] * nums[i], g[i-1] * nums[i]);当dp[i-1] >= 0, nums[i] <= 0 时, dp[i] = dp[i-1] + nums[i]当dp[i-1] <= 0, nums[i] >= 0 时,dp[i] = dp[i-1] + nums[i]当dp[i-1] >= 0, nums[i] >=0时,dp[i] = dp[i-1] + nums[i]dp[i]:表示以i位置为结尾最大子数组的和。

2025-01-17 10:03:16 897

原创 MySQL:事务

在应用层一个·业务逻辑可能不是一条sql语句就可以搞定的,简单来说,转账就需要把转账者的钱减少,还要将收账人的钱增加,为了防止转账出现一半的情况,就将这两条sql打包成事务,一起执行。MySQL是一个网络服务,这就注定MySQL会有大量的用户请求,就一定会引起并发问题,很多事务同时访问同一个表的数据一定会引起数据不一致的问题,所以事务不仅仅是简单的sql的集合,他还有4个特性用来解决数据不一致的问题。1.原子性:事务要么执行,要么不执行,执行不成功事务会自动回滚到事务的开始。

2025-01-16 17:33:12 904

原创 MySQL:索引

数据库一切的CURD操作都是在内存中,也就注定了需要有大量的IO操作,即使我需要修改的数据只有1kb也会直接加载16kb的数据到内存,因为我下次修改的数据也可能在这16kb中,在一定概率上提高了IO的效率。假设我想寻找8号杨过,遍历二级page的页目录,发现起始位置为6的页中,通过指针找到一级page,遍历一级page的页目录,发现正好与目录2指向的位置对应直接返回。数据库的page都是像链表一样串在一起的,page内的数据也是连接在一起的,也就是说我想找到某个数据必须从头遍历。16384就是16kb。

2025-01-14 17:53:06 342

原创 MySQL:表的内外连接

以t1.id和t1.sorce分组,聚合统计分组后每张表的数据,就是rank排名,这里需要对相同的分数进行去重,因为分数相同的排名是一样的。可以同一张表做笛卡尔积,筛选条件t2.score >= t1.score,经过该条件筛选出来的数据就是比t1分数大的数据。左外连接就是左表必须是完全显示,即使筛选条件没有成功,右表部分为空,左表部分也要显示出来。显示所有人的成绩,即使没有成绩也要把人的信息显示出来。内连接就是两张表做笛卡尔积,再加上一个筛选条件。这道题比较难想的一步就是怎么去确定rank排名。

2025-01-14 16:33:07 405

原创 MySQL:复合查询

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的。显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。显示每个高于自己部门平均工资的员工的姓名、部门号、工资、平均工资。查找每个部门工资最高的人的姓名、工资、部门号、最高工资。显示部门号为10的部门名,员工名和工资。显示各个员工的姓名,工资,及工资级别。

2025-01-13 14:23:26 237

原创 动态规划:简单多状态问题(2)

dp[i][0]表示i位置的房子是红色,那么i-1的位置要么是蓝色,要么是绿色,只需要在蓝色,只需要在蓝色和绿色之间选个小的 + i位置刷成红色的花费。因为使用了 i-1,所以将1位置初始化即可,dp[0][0] = costs[0][0]。返回min(dp[n-1][0],dp[n-1][1],dp[n-1][2])。

2025-01-13 06:19:16 729

原创 MySQL:内置函数

获取当前日期 年月日获取当前的时间 时分秒获取当前时间戳 自动转化为年月日时分秒从时间戳截取日期部分1990-10-1 + 10天1990-10-1 - 10分钟2025-1-11 - 1949-10-1相差多少天现在的日期和时间案例创建一个留言表插入两条数据查询一下显示所有留言信息,发布日期只显示日期,不用显示时间请查询在2分钟内发布的帖子因为时间隔得太久了,我们重新插入一条数据试试。

2025-01-11 15:55:45 222

原创 动态规划:简单多状态问题

f[i],表示选择该位置那么i-1位置是一定不选的,g[i-1]表示不选i-1位置的最大时长+i位置的时长就是 = 选择i位置的最大时长。g[i],表示不选择i位置的最大时长,同样的i-1位置可以选择 也可以不选,只需要在两种情况挑一个最大的即可。因为需要用到i-1所以需要初始化第一个位置,f[0] = nums[0] 因为f表示选择第一个位置。dp[i] 表示到达i位置时,总预约市场达到最大。g[i]表示:不选择该位置最大的预约时长。f[i]表示:选择该位置最大的预约时长。

2025-01-11 09:28:35 393

原创 Linux下的MySQL:表的增删查改

截断表就是用来专门清空表的数据的,因为截断表不走事物,会比delete更快,但是截断表的sql语句是不会被数据库保存的,使用的时候需要谨慎。孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80。数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩。将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分。查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示。查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示。

2024-12-24 09:13:59 483

原创 Liunx下MySQL:表的约束

约束就是约束ovO。约束是为了保证数据的合法性,业务逻辑的正确性逼这程序员做约束之内的事情。假如约束就是10之内的数字,那么程序员想要插入11,数据库不让程序员插入,就逼着你插入10以内的数字。

2024-12-22 09:53:10 572

原创 git的使用及其原理

git是一个版本控制器,git会记录每次对文件的改动。

2024-12-20 20:40:53 1155 1

原创 Linux下的MySql:enum和set的区别

直接select * from t3 where hobby='football';是不行的因为,where会严格匹配,他只会匹配那些爱好之有football的。第一个比特位的位置代表basketball,第二个比特位的位置代表football,第三个比特位的位置代表piano。所以我们如果想将这三个爱好全部插入,所需要的位是111,也就是7。想查询set的一个子集必须,是find_in_set函数。假设我想要查询所有,爱好是football的人。enum多选一 set多选多。enum和set 多选一。

2024-12-16 21:33:56 333

原创 Linux下MySql:表的操作

最后一行是数据库自己添加的,存储引擎,和字符集和校验集都是继承数据库默认。创建表的操作就是在对应数据库的文件夹中,创建一个表文件。在db3这个数据库,创建有一个名为t1的表。将name修改为varchar(60)查看创建该表的sql语句。删除birthday字段。

2024-12-15 21:00:50 228

原创 负载均衡oj项目:编译模块

编译运行模块是一个网络服务,这样编译模块就可以可以快速部署到,其他主机上。编译模块思路。

2024-12-15 19:32:07 251

原创 负载均衡oj项目:介绍

负载均衡oj是一个基于bs模式的项目。用户使用浏览器向oj模块提交代码,oj模块会在所有在线的后端主机中选择一个负载情况最低的主机,将用户的代码提交给该主机,该主机进行编译运行,将结果返回浏览器。该项目主要分为3个模块。1.comm模块:主要是一些公共的方法和工具类。2.complie_server: 将用户提交的代码进行编译运行。3.oj_server:该模块主要是获取所有题目列表,查看题目页面,负载均衡等功能。

2024-12-13 21:30:12 455

原创 LINUX下的Myql:库的操作

数据库的备份不是简单粗暴直接将数据库拷贝一份,而是将所有执行过的sql语句保存一份,恢复数据库的时候直接执行sql语句即可。1.创建一个db2数据库, 字符集设置为 utf8,校验集设置为 utf8_general_ci (不区分大小写)2.创建一个db3数据库, 字符集设置为 utf8,校验集设置为 utf8_bin (区分大小写)创建一个名为db1的数据库,LINUX会创建一个名为db1的文件夹。修改数据库,其实就是修改数据库的字符集和校验规则。创建的时候还可以设置数据库的字符集和校验集。

2024-11-07 19:07:37 652

空空如也

空空如也

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

TA关注的人

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