自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

没有百宝袋的哆啦A梦的博客

啥也不会,只有敲敲代码

  • 博客(44)
  • 收藏
  • 关注

原创 QT操作数据库

主要完成数据库的创建、数据库的打开、关闭等操作该类中常用函数:功能:为应用程序添加一个数据库,如果数据库不存在则添加,如果数据库存在,则直接构造参数:数据库驱动类型功能:判断某个数据库是否存在参数:数据库的名称 返回值:存在返回真,否则返回假功能:打开一个数据库,如果数据库存在则打开,否则创建一个数据库参数:无 返回值:bool类型,成功打开返回true失败返回false功能:设置数据库的名称参数:数据库名称 返回值:无。

2024-09-12 17:03:25 1360

原创 QT中的TCP网络通信

4> 可以使用类中的成员函数 nextPenddingConnection 可以获取最新连接的客户端套接字。3> 当有客户端发来连接请求后,该服务器就会自动发射一个newConnection的信号。4> 如果客户端收到服务器发来的消息后,该客户端就会自动发射一个readyRead的信号。6> 当服务器收到客户端的消息后,该服务器会自动发射一个readyRead的信号。可以将该信号连接到对应的槽函数中,处理客户端发来的消息。可以将该信号连接到对应的槽函数中,处理客户端发来的消息。

2024-09-11 19:56:52 2087

原创 QT核心机制

1. 什么是事件?(重点)事件是由窗口系统或者自身产生的,用以响应所发生的各类事情,比如用户按下并释放了键盘或者鼠标、窗口因暴露而需要重绘、定时器到时而应有所动作,等等从某种意义上讲,事件比信号更原始,甚至可以认为大多数信号其实都是由事件产生的。比如一个下压式按钮首先感受到的是鼠标事件,在进行必要的处理以产生按钮下沉继而弹起的视觉效果之后,才会发射 clicked()信号2. 如何处理事件?(重点)

2024-09-10 19:32:01 1268

原创 QT基础

1> 在对象树模型中,子组件构造时,需要指定父组件而存在2> 子组件的生命周期由父组件进行管理3> 当父组件展示时,会将子组件一并展示,当父组件释放空间时,会将加载在该组件上的所有子组件的空间全部释放4> 对象树模型保证了,各个组件的内存不会泄露5> 在栈区申请的组件,程序结束后,由系统自动回收,在堆区申请的组件,结束后,由其父组件进行回收资源6> 父组件和子组件要用于共同的祖先类,实现的理论基础为多态7> 每一个组件中都会拥有一个父组件指针和一个子组件链表1> 原理。

2024-09-06 20:23:04 1649

原创 C++基础智能指针

独占智能指针会“拥有”它所指向的对象,某一时刻,只能有一个unique_ptr指向给定的对象,当该指针被销毁时,指向的对象也会随之释放。shared_ptr共享他指向的对象,多个共享指针可以指向(关联)相同的对象,在内部采用计数器机制来实现当新的shared_ptr与对象关联时,引用计数器增加1当shared_ptr超出作用域时,引用计数器减1,当引用计数器变为0时,则表示没有任何shared_ptr与对象关联,则释放该对象​class Testpublic://名字。

2024-09-05 19:05:10 1917

原创 C++基础之杂项

1> 格式 : [捕获列表](函数形参列表)[mutable] [->返回值类型]{函数体内容};2> 解析1、捕获列表:分为值捕获和引用捕获值捕获:值捕获时,表达式中的数据和外界的数据属于不同的数据,并且在非mutable的lambda表达式中值捕获数据可读不可写[变量1,变量2,。。。,变量n]:将这些数据都进行值捕获[=]:将外界的变量全部进行值捕获[=,&变量1,&变量2]:除了将变量1和变量2进行引用捕获外,其他都是值捕获。

2024-09-04 19:22:20 1918

原创 C++基础多态

1> 当使用父类指针指向子类对象时,构造时会正常先构造父类后构造子类,但是在使用delete释放内存空间时,由于父类指针的作用域,只作用在子类的父类空间内,所以,只会调用父类的析构函数,子类自己的空间就泄露了。4> 如果一个类中的某个函数定义成虚函数,那么该类的子子孙孙类中的该函数都是虚函数,即使没有加virtual。7> 如果包含纯虚函数的子类中没有重写其虚函数,那么其子类也是抽象类,子类中的该函数也还是纯虚函数。2> 以便于使用父类的指针或引用指向子类对象,调用子类中重写的父类的虚函数。

2024-09-03 20:05:20 1835

原创 C++基础运算符重载和继承

1> 修饰函数的局部变量,表示将当前变量独立于整个函数而存在,其生命周期随着整个程序的编译而产生,整个程序结束而终止,即使函数没有被调用,静态成员变量的内存空间也已经存在了,即使函数以及运行结束,静态成员变量的生命周期也没有结束。一次初始化,后期调用函数时,都具有保值功能。2> 修饰类中成员变量,为静态成员变量,不依附于类对象而存在,编译时系统分配空间,需要在全局处进行定义。即使没有类对象,也可以通过类名直接使用,也可以通过类对象进行使用。

2024-09-02 20:29:41 1439

原创 C++基础匿名对象,友元和常成员(const)

1> 不到万不得已的情况下,不要使用友元,因为友元的出现使得封装称为虚谈,友元破坏了类的封装性2> 友元不具有传递性:A是B的朋友,B不一定是A的朋友3> 友元不具有传递性:A是B的朋友,B是C的朋友,A不一定是C的朋友4> 友元不具有继承性:父类的朋友,不一定是子类的朋友5> 必须使用友元的情况:插入和提取运算符重载时,只能使用友元函数来解决。

2024-08-30 18:48:54 1470

原创 C++基础面向对象特征

class 类名 { public: 功能的成员属性、函数 protected: 受保护的成员属性、函数 private: 私有的成员属性、函数 };1> 类中的成员属性和成员函数分为不同的权限public:该权限下的成员,可以在类内、子类中、类外被访问protected:该权限下的成员,可以在类内、子类中直接被访问,类外不允许被访问private:该权限下的成员,只能在类内被访问,子类、类外不允许被访问2> 如果没有指定权限,则默认为私有权限。

2024-08-29 19:58:22 1509

原创 C++基础引用与堆区空间申请

类型名 &引用名 = 目标名;例如:int num = 520;//定义一个引用,并指向一个num目标对&又进一步使用,&的使用方式1、&表示单目运算符,取地址运算,后面紧跟一个变量2、&&表示双目运算符逻辑与运算3、&表示双目运算符,按位与运算4、&表示定义引用1> 在C语言中,对于堆区空间的申请和释放,使用的是malloc和free函数,C++中也可以继续使用2> 在C++中,提供了更加操作方便的关键字 new和delete用于堆区空间的申请和释放。

2024-08-28 19:46:01 1411

原创 C++基础

namespace 命名空间名类型 名字1;//定义属于自己的命名空间void fun()int main()//使用方式1:连名带姓使用//使用方式2:将某个名字声明//20//使用方式3:将整个命名空间进行声明fun();return 0;使用时,如果使用的是最里层的名字,则需要使用作用域限定符一级一级找到最里层。

2024-08-27 18:24:41 1235

原创 IO多路复用

功能描述:以阻塞的形式监视 readfds,writefds,exceptfds 这3个描述符集合中,所有描述符,如果有任何描述符激活,则select解除阻塞。① select中 fd_set 类型大小固定,1024个,如果要监视的描述符数量超过1024个,就会有问题。注意:只要select监视到了有描述符激活,就会将激活的描述符,以覆盖的形式写入到上述3个fds里面去。功能描述:监视 fds所指向的描述符数组中所有描述符的情况,最多监视nfds个,一般就是数组的容量。

2024-08-21 20:20:19 1405

原创 C,数据结构,多进程线程,网络编程面试题总结

面试题

2024-08-20 20:43:12 1374

原创 基于UDP的TFTP文件传输

服务器在69号端口等待客户端的请求服务器若批准此请求,则使用 临时端口 与客户端进行通信。每个数据包的编号都有变化(从1开始)每个数据包都要得到ACK的确认,如果出现超时,则需要重新发送最后的数据包或ACK包数据长度以512Byte传输的,小于512Byte的数据意味着数据传输结束。

2024-08-17 10:25:42 1003

原创 基于UDP的网络聊天室

【代码】基于UDP的网络聊天室。

2024-08-16 10:25:19 1033

原创 TCP并发服务器

实现原理:主线程主要完成accept接收客户端连接请求的阻塞,当客户端发来连接请求后,创建一个分支线程用于跟客户端进行通信。实现原理:父进程主要用于解决accept接收客户端连接请求的阻塞,当有客户端发来连接请求后,创建出子进程用于通信使用。

2024-08-16 09:55:17 412 2

原创 多点通信

2> 组播可以实现小范围的数据传播:将需要接收数据的接收端加入多播组,发送端向多播组中发送消息,每个组内成员都能接收到消息。1> 组播也是实现一对多的通信方式,对于广播而言,网络需要对每个消息进行复制转发,会占用大量的带宽,导致网络拥塞。4> 组播也是使用UDP实现的,无论接收端是否愿意接收数据,发送端都可以正常向多播组中发送数据。1> 广播是实现网络通信中一对多的通信方式,发送端用于发送数据,每个接收端都可以收到消息。2> 对于套接字而言,一般是不允许发送广播消息的,需要对发送端套接字进行设置允许广播。

2024-08-13 19:52:20 1085

原创 TCP与UDP的基础通信

功能:位套接字分配名称参数1:通过socket函数创建出来的套接字文件描述符参数2:通用地址信息结构体,需要根据具体使用的地址族而定, struct sockaddr仅仅只是为了类型的强制转换,防止出现警告跨主机间通信:man 7 ip/* 表示通信域 *//* 端口号的网络字节序 *//* ip地址 *//* IP地址的网络字节序 */同一主机间通信:man 7 uninx/* 表示通信域:AF_UNIX *//* 套接字文件的地址 */

2024-08-12 19:40:14 1222

原创 网络编程基础

为了方便记忆,我们将四字节ip地址的整数的每一个字节转换成十进制数,并使用点分割,组成一个字符串,这个字符串就是ip地址的点分十进制。1> 回顾大端存储和小端存储:不同的主机在存储多字节整数时的存储方式有所不同,根据存储方式的不同,我们称为大端存储的主机和小端存储的主机。5> TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议。但是,在网络传输中,ip地址展现的是4字节无符号整数的形式,所以在传输ip地址时,需要考虑字节序的问题。

2024-08-10 15:15:44 1302

原创 进程间通信

IPC_EXCL:表示本次确保要创建一个新的消息队列,如果该消息队列已经存在,则该函数报错,错误码为EEXIST。IPC_EXCL:表示本次确保要创建一个新的共享内存,如果该共享内存已经存在,则该函数报错,错误码为EEXIST。IPC_CREAT:表示本次操作要创建一个消息队列,如果该key值对应的消息队列已经存在,则直接打开该消息对象。2. 消息队列的消息遵循先进先出原则,如果取出时不指定类型,则默认取第一个,如果指定了类型,则取第一个放入队列中的该消息。/* 创建消息队列的进程的用户id */

2024-08-06 17:45:37 1506

原创 进程间通信

程序允许启动一个定时器,当所定的时间到位后,会发送一个SIGALRM信号,我们可以将该信号绑定到对应的信号处理函数中,从而导致,给定时间后,处理自定义函数。4> 可以使用文件来完成两个进程间通信,一个进程向文件中写数据,另一个进程从文件中读数据,但是,又因为进程的调度是时间片轮询,上下文切换,所以,不确定先执行哪一个进程,文件操作有些行不通,但是不完全行不通。功能:创建一个管道,用于进程间通信,并通过参数返回该管道的两端,pipefd[0]是管道文件的读端,pipefd[1]是管道文件的写端。

2024-08-05 20:03:17 1418

原创 线程通信

2> 条件变量中维护了一个队列,想要执行的消费者线程,需要先进入等待队列中,等生产者线程进行唤醒后,依次执行。2> 互斥锁的本质:互斥锁本质上也是一个特殊的临界资源,该临界资源在同一时刻只能被一个线程所拥有,当一个线程试图去锁定被另一个线程锁定的互斥锁时,该线程会阻塞等待,直到拥有互斥锁的线程解锁了该互斥锁。4. 循环等待条件:存在一个线程(或多个线程)的集合{P1, P2, ..., Pn},其中P1正在等待P2持有的资源,P2正在等待P3持有的资源,依此类推,直至Pn正在等待P1持有的资源。

2024-08-02 16:29:30 1274

原创 多线程编程

如果程序中使用的线程支持库中的函数,编译程序时,需要加上 -lpthread 选项。1> 线程:也称为轻量版的进程(LWP),是更小的任务执行单元,是进程的一个执行路径。4> 线程几乎不占用资源,只是占用了很少的用于程序状态的资源(大概有8k左右)5> 由于多个线程共同使用进程的资源,导致,线程在操作上容易出现不安全的状态。9> linux中不直接支持线程相关的支持库,需要引入第三方库,线程支持库。3> 一个进程中可以包含多个线程,多个线程共享进程的资源。7> 一个进程中,至少要包含一个线程(主线程)

2024-08-01 18:58:53 1096

原创 多进程编程

1> 在进程的创建过程,其实就是通过拷贝父进程的task_struct结构体而来的,子进程中保存了大部分的父进程的遗传基因,只需要修改少部分的内容,如子进程的进程号,子进程的父进程号。1> 0号进程:也成为 idel 进程,他是操作系统启动后执行的第一个进程,这个进程也叫空闲进程,当没有其他进程执行时,系统会默认执行该进程。1号进程和2号进程都是由0号进程创建出来的。3> 2号进程:也称kthreadd,该进程由0号进程产生,也成为调度进程,当某个就绪进程时间片轮到时,该进程负责进程的调度工作。

2024-07-31 19:48:08 1336

原创 文件IO

--------------------以上三种方式必须要包含其中一种,下面的是可选的-------------------------O_EXCL:判断文件是否存在,如果存在则报错,如果文件不存在,则可以联合O_CREAT一起创建文件。功能:拷贝旧文件描述符,放入新文件描述符中,如果新文件描述符之前已经打开,则在拷贝时,默认将其关闭。一般普通文件的权限是0666 --> 0664,目录文件权限最大为0777 ->0775。这种情况下,没有新文件描述符产生,使用的是同一个文件描述符,共享同一个文件光标。

2024-07-30 18:50:07 938

原创 标准IO

【代码】标准IO。

2024-07-29 18:58:44 748

原创 标准IO

标准IO:fprint、fscanf、fputc、fgetc、fputs、fgets、fread、 fwrite、fopen、fclose、 fseek、ftell、rewind。3、提供的偏移量的宏值 SEEK_SET:文件起始位置 SEEK_END:文件结束位置 SEEK_CUR:文件当前位置。5、默认提供的文件指针: stdin:标准输入指针 stdout:标准输出指针 stderr:标准出错指针。2、标准IO操作的是文件指针,文件IO操作的是文件描述符。

2024-07-26 18:03:15 1660

原创 算法与排序算法

程序核心代码写注释、程序代码有缩进、程序代码命名规范。对于给定的不合理的输入数据,能够给出相应的处理措施。算法中每一条语句都有确定的含义,不能模棱两可。给定合理的输入数据,能够得到正确的结果。4> 归并排序:二路归并、多路归并。经济可行性、社会可行性、能够运行。O(f(n)):使用O阶记法,记录算法时间复杂度。程序执行一段时间后会自动结束。f(n) :是问题规模与执行次数之间的函数。要求时间复杂度要尽可能低。要求空间复杂度尽可能低。至少有零个或多个输入。T(n):时间复杂度。

2024-07-24 17:47:45 1265 1

原创 队列和二叉树

1> 队列也是操作受限的线性表:所有操作只能在端点处进行,其删除和插入必须在不同端进行2> 允许插入操作的一端称为队尾,允许删除操作的一端称为队头3> 特点:先进先出(FIFO)4> 分类:顺序存储的队列称为顺序队列链式存储的队列,称为链式队列。

2024-07-23 19:02:05 1144

原创 双向链表,循环链表与栈

3> 双向循环链表:需要将最后一个阶段的指针域指向头结点,头结点的前驱指针指向最后一个阶段。1> 参数:不需要,只需要从堆区申请出一个头结点大小的空间,就创建了一个双向链表。1> 栈:操作受限的线性表,插入和删除只能在同一端进行,不能在中间进行相关操作。3> 注意:需要使用一个遍历指针,从第一个节点出发,到最后一个节点。3> 注意:需要将所有的节点,全部删除后,然后删除头结点。2> 允许操作的一端,称为栈顶,不允许操作的一端称为栈底。4> 栈的分类:根据存储方式的不同,分为顺序栈和链式栈。

2024-07-22 20:45:41 1271

原创 单向链表

一定要从新节点出发,指向后面的节点,然后将前驱节点指向字节。需要使用一个遍历指针,将每一个节点进行遍历一遍,如果该指针指向的节点不为空,就访问其数据域,向后偏移。3> 注意:需要将要删除的节点先标记一下,头节点的指针,指向第二个节点后,将标记的节点释放。3> 注意:必须找到要插入位置的节点的前驱节点,将前驱节点当作头节点,进行头插操作。3> 注意:需要找到要删除的节点的前驱节点,将其当作头节点,进行头删逻辑。6、头节点:虚设的一个节点,数据域不存放数据元素,可以存放链表的长度。

2024-07-19 19:42:52 1341

原创 顺序表

3. 顺序表的表示方式:除了使用一个连续的内存存储顺序表外,还需要外加一个表示顺序表实际长度的变量完成。1、对于添加顺序表元素的操作而言,需要判断顺序表是否已经满了,如果满了的话,则添加失败。2、对于减少顺序表元素的操作而言,需要判断顺序表是否已经空了,如果空了的话,就减少失败。1、 判断逻辑:顺序表不为空,顺序表不满,要插入位置不能小于0,也不能大于len。1、可以在堆区申请一个顺序表,后面操作时,只需要将该顺序表的起始地址传递即可。2、每次添加的数据放入到顺序表的最后面,也就是放在len所在的位置。

2024-07-18 17:42:08 1184

原创 共用体与动态内存分配

由相同数据类型或不同数据类型构成的集合,但是,该集合中的成员共享同一块内存空间union 结构体名称成员类型1 成员变量1;成员类型2 成员变量2;。。。成员类型n 成员变量n;当程序员写程序时,可能会因为数据类型的问题,在定义变量时,导致该程序比较晦涩难懂,例如:unsigned long int ,struct Stu为了提高代码的简洁性,以及为了更加方便理解使得代码更加优雅,我们可以将这些类型重新起一个简洁好记的名字。引入了关键字 typedef。

2024-07-17 19:57:29 1416

原创 结构体

struct 结构体名称成员类型1 成员变量1;成员类型2 成员变量2;。。。成员类型n 成员变量n;注意事项:1、struct是定义结构体类型的关键字,不能省略2、结构体名称:标识符,符合命名规则,一般建议首字母大写3、成员属性使用一对花括号包裹起来4、成员类型可以是基本数据类型,也可以是构造数据类型、指针类型5、定义结束后,必须加上 分号结尾6、举个例子//姓名int age;//年龄//成绩//定义一个英雄类型。

2024-07-16 18:49:07 968

原创 Linux C语言基础 day10

例如:主函数中定义一个长度为8的数组,调用自定义函数完成输入、自定义函数完成输出、自定义函数求最大值、自定义函数完成数组的逆置。当实参使用的是数组名进行传递时,本质上传递的是数组首元素的地址。1. 一维数组的数组名,本质上是一个该数组的第一个元素的地址。// 输出逆置后的数组。虽然使用的是数组接收,但是,本质上也还是使用的是指针接收。// 自定义函数 my_strstr,实现 strstr 函数的功能。//将b里的值写入a。

2024-07-12 21:24:21 2283

原创 Linux C语言基础 day9

数据类型 * 指针名;例如:int * ptr;

2024-07-11 20:26:43 1235

原创 Linux C语言基础 day8

返回值类型 函数名(函数的形参列表){ 函数体;

2024-07-10 19:21:48 1498

原创 Linux C语言基础 day7

数据类型 数组名[常量1][常量2];char 数组名[常量];

2024-07-09 20:35:44 1537

原创 Linux C语言基础 day6

套路:将数组中的第一个先设置成当前的最值,然后拿着当前的最值与数组中的任意一个元素进行比较,如果比较过程中,不满足条件,则更新最值,直到所有数据都跟最值比较一番后,得出最值。printf("当前数组的最大值为:%d, 在数组的第%d个位置\n", max, maxi+1);2.部分初始化:初始化元素的个数,小于数组的长度,此时,默认从前面元素进行初始化,没有初始化的元素用0补齐。//更新最值中的数据。3.特殊初始化:在定义数组并初始化时,可以不用给定数组的长度,数组的长度由初始化元素个数而定。

2024-07-08 17:28:10 1532

空空如也

空空如也

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

TA关注的人

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