- 博客(112)
- 收藏
- 关注
原创 C++:多态
当一个类包含虚函数时,编译器会在该类的对象中插入一个指向虚函数表的指针,这个指针通常是在对象的开始位置。当调用一个虚函数时,实际上是通过这个指针找到对应的虚函数表,然后在虚函数表中查找对应函数的地址并调用它。每个含有虚函数的类都会在内存中维护一个虚函数表,用来存储该类的虚函数地址。同时,继承也可以实现代码的扩展和灵活性,子类可以覆盖父类的方法或添加新的方法。当一个类继承了另一个类并重写了基类的虚函数时,将基类指针指向派生类对象时,通过。中重写的虚函数,调用普通函数时调用的是基类中的普通函数。
2024-04-04 14:46:23
485
原创 QT:三大特性
类中需要添加O_OBJECT宏声明:signals标签之下进行声明定义:信号不需要定义发送信号:emit 信号();emit 信号(参数1, 参数2, ....);信号可以重载,当槽函数需要参数时由信号给它传递。
2024-03-21 12:35:58
1056
原创 C++:STL(标准模板库)
vector向量相当于一个数组,在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。优点:可以不指定大小,使用push_back、pop_back来进行动态操作。随机访问方便,即支持[ ]操作符与at()节省空间缺点:在内部进行插入、删除的效率低。只能在最后进行push和pop。当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。
2024-02-25 15:27:56
2861
原创 面向对象设计模式
注意:纯虚函数被派生类实现完后即为虚函数,当基类指针指向派生类对象时,当基类指针调用虚函数时即调用的是派生类虚函数;优势:规范接口(纯虚函数);4、工厂类 (生产)4、工厂类 抽象类 (生产方式)4、工厂类 抽象类 (生产方式)1、产品基类(设计):抽象类。1、产品基类 抽象类 (产品属性)1、产品基类 抽象类 (产品属性)2、派生具体的产品A类(设计)3、派生具体的产品B类(设计)2、派生具体的产品A类。3、派生具体的产品B类。2、派生具体的产品A类。3、派生具体的产品B类。
2024-02-23 19:04:44
960
原创 C++:模板
C++模板是支持参数化多态的工具,就是让类或者函数声明为一种通用类型,使得类中的某些成员变量或者成员函数的参数、返回值在实际使用中可以是任意类型。函数模板:针对仅参数类型不同的函数。类模板:针对仅成员变量和成员函数类型不同的类。模板声明或者定义:只能在全局、名字空间、类范围内,即不能在局部范围、函数内进行,如:不能在main函数中声明或者定义一个模板。
2024-02-22 19:02:12
916
原创 C++:友元
友元打破了访问权限的限制,即让访问权限不生效。友元也类的隐藏与封装,所以必须慎用。1、类的友元C函数;2、类的友元成员函数;3、类的友元类。
2024-02-21 13:47:20
390
原创 C++:static关键字
注意:类方法不能访问非static修饰的函数、变量,因为类方法不属于类,程序刚运行时就存在,非类方法、变量没创建对象前不存在。访问:类::类变量 , 对象.类变量 , 对象指针->类变量;底层都是类::类变量。4、类成员在任何地方都可以使用“类::类成员”的方式访问。非类方法一定能访问类方法,非类方法存在时,类方法一定存在。2、类方法中只能访问类成员(类变量、类方法);类中定义:static int a;1、类方法中无this指针;3、同类中所有对象共享;3、类方法可以被访问;
2024-02-21 13:18:34
420
3
原创 C++:const关键字
1、常对象中所有成员变量的值都不能被修改,必须通过构造函数的两种方式将所有成员变量进行初始化。2、常对象可以访问成员变量、常成员变量、常成员函数,不能访问非常成员函数。3、常成员函数只能调用常成员函数(普通成员函数可能会修改成员变量的值);常成员函数不能调用非常成员函数(存在可能修改成员变量的逻辑)2、常成员函数中不能含有修改成员变量的逻辑;2、常成员变量可以被访问,但是不能被修改;1、常成员函数中不能修改任何成员变量的值;能访问成员变量、常成员变量、常成员函数。4、常成员函数可以被成员函数调用。
2024-02-20 17:02:48
359
原创 C++:构造函数
/移动构造(普通构造构造临时对象,再拷贝构造拷贝临时对象,最后释放临时对象)//深拷贝构造函数,拷贝内容到自己的空间。4、过程:先普通构造创建临时对象,再通过移动构造拷贝临时对象内容(实际上是浅拷贝),最后释放临时对象。//obj=stu1(引用类型取别名)//移动构造,使用临时对象的空间。3、作用:用于临时对象时,指针可直接指向临时对象的空间使用。19 #if 0 //浅拷贝、深拷贝只会存在一个。1、调用:Stu stu2 = Stu(10);
2024-02-20 14:00:06
910
原创 C++与C的区别
优化,提供效率,在编译时将调用函数的代码直接嵌入到主调函数中,这种嵌入到主调函数中的函数称为内置函数(内嵌函数/内联函数)。C++中结构体使用较少,结构体升级后为class(类),class拥有结构体所有功能。名字空间域:防止多人开发时使用相同名字的函数、变量,所以使用不同的名字空间以区分。内联函数使用一般为5个语句以下,不能包括复杂语句,如循环和switch语句。函数名相同,函数参数的个数不一样/函数参数的类型不一样。C++:局部域、全局域、类域、名字(称)空间域。用途:函数的传参、函数的返回值。
2024-02-19 12:44:13
432
原创 网络编程预备知识
大端序和小端序是针对数据在内存中的存储顺序,而主机字节序和网络字节序则是针对数据在不同计算机体系结构和网络传输中的字节顺序。HTTP(超文本传输协议)、FTP(文件传输协议)、Telnet(远程登录协议)。以太网协议、令牌环网、PPP协议。linux中的套接字(socket):是linux提供给用户使用其内核集成网络协议的接口。由于主机字节序不确定,在通信中将主机字节序转为网络字节序(大端)。3、网络层:IP协议、ICMP(报文控制协议)、IGMP。字节序:指在存储和传输多字节数据时,字节的排列顺序。
2024-02-15 15:27:35
991
原创 线程相关知识梳理
劣势:由于线程共享同一片内存空间,因此会存在资源竞争的问题,可使用同步、互斥机制来解决,同步机制可以确保多个线程按照一定的顺序执行,而互斥机制可以保证在同一时间只有一个线程访问共享资源。由于线程间使用同一片进程空间,因此通信过程实际上非常简单,使用全局变量进行数据的传递,多个线程可同时访问资源,同步、互斥两种机制用于解决访问共同资源时的问题。线程是轻量级的进程,被包含在进程之中,多个线程使用同一片进程空间。优势:解决了进程间切换耗费时间的问题,由于使用同一片内存空间,因此通信会更加简单(使用全局变量)。
2024-02-10 14:15:26
404
原创 进程相关知识梳理
子进程拷贝父进程(除进程id号)外的所有内容,不过子进程从fork函数之后开始运行程序,规定父进程会回收子进程产生的资源,如果父进程先于子进程结束,子进程将会变成孤儿进程,由init进程收养。3、守护进程:是一个后台进程(不属于交互类进程),在操作系统启动的时候就可以运行的一个进程,在操作系统即将结束的时候结束的进程。进程:一个程序执行的体现,包括创建、调度、执行、消亡,是系统资源分配的最小单位。子进程id号返回给父进程,0返回给子进程。1、交互类进程:由shell控制,分为前台进程、后台进程两种。
2024-02-08 18:07:02
971
原创 进程间通信(5):信号灯集
信号灯集为信号量的集合,实现同步、互斥机制,配合共享内存使用,解决资源竞争问题。信号灯也叫信号量,是不同进程间或一个给定进程内部不同线程间同步的机制。函数:semget、semctl、semop。1、创建信号灯集的IPC对象 semget。3、创建共享内存IPC对象 shmget。2、信号灯集初始化 semctl。7、删除共享内存IPC对象。8、删除信号灯集IPC对象。4、内存映射 shmat。5、PV操作 semop。6、撤销映射 shmdt。
2024-02-08 16:34:35
445
原创 进程间通信(4):消息队列
函数:msgget(搭配ftok)、msgsnd、msgrcv、msgctl。2、通信(内置函数:msgsnd、msgrcv)1、创建消息队列IPC对象 msgget。结果:队列1证明了消息的有序性。先进先出,保证信息的有序性。3、删除消息队列IPC对象。
2024-02-07 16:09:22
439
原创 进程间通信(3):共享内存
多个进程共享同一片内存空间,不需要进行数据的拷贝,效率最高;但存在资源竞争问题。函数:shmget(搭配ftok)、shmat、shmdt、shmctl。1、创建共享内存IPC对象 shmget(ftok)5、删除共享内存IPC对象 shmctl。3、通信 scanf、printf。2、内存映射 shmat。4、撤销映射 shmdt。
2024-02-07 14:28:58
360
原创 进程间通信(2):信号通信
结果:按Ctrl+z打印Hello World!按Ctrl+c打印Hi!在另一个终端杀死进程即可。SIGTSTP(Ctrl+z):该信号的默认处理方式为将进程进入停止态。SIGINT(Ctrl+c):该信号的默认处理方式为结束进程。查看信号编号及对应宏kill -l。
2024-02-07 13:33:07
417
原创 进程间通信(1.2):有名管道
如果读端关闭,写端继续向管道内写数据将会导致管道破裂,内核将会发送信号SIGPIPE到进程中,该信号的默认处理方式为结束进程;管道文件的大小固定为64K,如果写入数据超过64K并且没有对数据进行读操作,那后续写入动作将会被阻塞。如果写端关闭,读端继续从管道中读取数据将会读不到任何数据;有名管道可用于读写;半双工通信,可读可写,不可以同时读写。读端关闭:继续写,管道破裂,进程结束。写端关闭:读端将读不到任何数据。
2024-02-06 16:59:01
446
原创 进程间的通信方式
如果读端关闭,写端继续向管道内写数据将会导致管道破裂,内核将会发送信号SIGPIPE到进程中,该信号的默认处理方式为结束进程;其中SIGKILL、SIGSTOP不可以被忽略、不可以被阻塞、不可以被捕获,只能采用默认处理方式。6、SIGTSTP(Ctrl+z):该信号的默认处理方式为将进程进入停止态。4、SIGCONT:该信号的默认处理方式为将停止态的进程重新恢复到运行态。信号灯集为信号量的集合,实现同步、互斥机制,配合共享内存使用,解决资源竞争问题。2、SIGKILL:该信号的默认处理方式为结束进程。
2024-02-06 15:06:14
395
原创 数据结构:完全二叉树(递归实现)
完全二叉树的编号方法是从上到下,从左到右,根节点为1号节点,设完全二叉树的节点数为sum,某节点编号为i,如果完全二叉树的深度为h,那么除了第h层外,其他层的节点个数都是满的,第h层的节点都靠左排列。当2*i <= sum时,有左孩子,其编号为2*i,否则没有左孩子,本身为叶节点。当2*i+1 <= sum时,有右孩子,其编号为2*i+1,否则没有右孩子。
2024-01-23 15:03:20
904
原创 数据结构:非完全二叉树(递归实现)
非完全二叉树是指在二叉树中,除了叶子节点(无子节点)外,其他节点的子节点个数可以不同,即不一定是每个节点都有两个子节点,有右孩子时也不一定有左孩子。
2024-01-21 17:51:36
783
1
原创 数据结构:链式队列
队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;以下代码采用第一种规定。2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;
2024-01-20 16:54:44
546
原创 数据结构:顺序循环队列
队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。为区分空队与满队,满队元素个数比数组元素个数少一个,front=rear为空队。1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;以下代码采用第二种规定。
2024-01-20 14:20:05
692
原创 QT:画一个简单的时钟(坐标系移动、坐标系旋转、保存坐标系、恢复坐标系)
【代码】QT:画一个简单的时钟(坐标系移动、坐标系旋转、保存坐标系、恢复坐标系)
2023-10-03 13:51:46
1096
原创 OT:数字设定框(QSpinBox:处理整数,QDoubleSpinBox:处理浮点数)
【代码】OT:数字设定框(QSpinBox:处理整数,QDoubleSpinBox:处理浮点数)
2023-09-18 23:15:55
176
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人