自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 面试官最爱问的特殊类到底是怎么肥四

目录1、请设计一个类,只能在堆上创建对象2、请设计一个类,只能在栈上创建对象3、请设计一个类,不能被拷贝4、请设计一个类,不能被继承5、请设计一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式面试官:请设计一个类...我:然后,我就想到一句话让我康康还有谁跟我一样“死鱼安乐”,扶我起来,我还能学!!1、请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有,防止别人调用拷贝构造在栈上生成对象 提供一个静态成员函数,

2021-06-05 12:13:29 177 1

原创 构造函数可以是虚函数吗?不看看你就亏大了

首先,构造函数是不能为虚函数的调用构造函数后, 才能生成一个对象。 假设构造函数是虚函数, 虚函数存在于虚函数表中, 而去找虚函数表又需要虚函数指针, 而虚函数表指针又存在于对象中, 这样就矛盾了: 都没有生成对象, 哪有什么虚函数表指针呢?那么问题又来了,析构函数可以是虚函数吗?答:可以把基类析构函数定义为虚函数,在调用析构函数时,会根据指向的对象类型到它的虚函数表中找到对应的虚函数,此时找到的是派生类的析构函数,因此调用该析构函数;而调用派生类析构函数之后会再调用基类的析构函数,因此不会导致内

2021-06-03 22:12:38 7271 6

原创 面试前你必须知道的网络知识,学到就是赚到

目录应用层HTTP协议格式是什么样的cookie和session的区别长连接和短连接的区别如何控制长连接与短连接HTTP粘包怎么解决301和302有什么区别GET和POST有什么区别HTTPS加密流程是什么样的HTTP和HTTPS的区别HTTP不同版本之间的区别传输层三次握手以及四次挥手的过程是什么样的握手为什么是三次,挥手为什么是四次TIME_WAIT状态有什么用一台主机上出现大量的CLOSE_WAIT或者TIME_WAIT的原因是什么,怎么

2021-04-18 19:51:49 212

原创 选择排序

排序原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素存放在序列的起始位置,知道全部待排序的数据元素排完图解:(假设原数组为:5,2,4,6,3,1)代码实现:int GetMinIndex(vector<int>& v, int left, int right){ int min = v[left]; int index = left; for (int i = left + 1; i<right; ++i) { if (v[i]

2021-04-13 19:43:30 89

原创 冒泡排序

排序原理:将临近的两个元素互相比较,将大的元素放在后面,依次循环下去,第一趟完成比较后,最大的元素会排在最后,第二趟后第二大的元素会排在倒数第二位,n-1趟后元素全部被排完。图解:(假设原数组为:5,2,4,6,3,1)代码实现:void BubbleSort(vector<int>& v, int left, int right){ for (int i = left; i < right; i++){ for (int j = left; j &

2021-04-13 17:13:13 59

原创 直接插入排序

排序原理:当插入第i(i>=1)个元素时,前面的i-1个元素已经排序好,此时用第i个元素的值与第i-1,i-2个元素的值进行比较,找到插入位置就可将第i个元素插入,原来位置的元素顺序后移图解:(假设原数组为:5,2,4,6,3,1)图画的略微有点敷衍,大家凑合着看代码实现:#include<iostream>#include<vector>using namespace std;void QuickSort(vector<int&gt

2021-04-12 15:16:36 91

原创 Linux——网络(数据链路层)&ARP&DNS

数据链路层:负责相邻设备之间的数据传输以太网以太网协议:描述相邻设备以太帧格式MAC地址:网卡设备的物理硬件地址,通常在出厂时就会设定,无符号6字节的整数MAC地址和IP地址的不同:MAC地址描述的是路途上的每一个区间的起点和终点 IP地址描述的是路途总体的起点和终点48位对端MAC地址 + 48位源端MAC地址:标识哪两个相邻设备在进行数据传输16位上层协议类型:记录网络层使用的协议类型,用于数据分用时上层解析协议的选择32位校验和帧尾:CRC校验和..

2021-04-11 17:48:26 131

原创 Linux——多路转接IO(select、poll、epoll)

1、多路转接IO多路转接IO:也叫多路复用IO,是一种模型技术——针对大量的描述符进行就绪事件监控,判断哪个描述符就绪了指定事件,让进程能够针对就绪的描述符进行操作,进而提高进程对描述符的处理效率,并且可以对某个描述符IO进行超时控制应用场景:只有对描述符进行监控的需求或想要对描述的IO进行超时控制的需求都可以使用多路转接模型,常被用于高并发服务器中的事件触发模型适用于有大量描述符需要监控,但是同一时间只有少量活跃的场景,或者就是单个描述符的IO超时控制的场景多路转接模型与线程池:多路

2021-04-11 10:43:47 191

原创 四种IO模型(阻塞IO/非阻塞IO/信号驱动IO/异步IO)

1、IO过程:等待IO就绪,数据拷贝2、阻塞IO若IO条件不具备,则一直等待流程简单,但是效率低简单图解:3、非阻塞IO若IO条件不具备,则操作直接报错返回相较于阻塞IO,非阻塞IO对于资源的利用率有所提高,但操作复杂度有所提升,因为这种非阻塞操作通常要循环进行,IO操作不够实时简单图解:非阻塞IO的实现:非阻塞的实现:recv/send(fd, buf, len, flag); 其中flag设置为MSG_DONTWAIT 设置描述符属性:int fcn..

2021-04-09 23:45:36 292

原创 Linux——最全基础指令(总结)

目录详解参考:https://blog.csdn.net/m0_46657980/article/details/107909843ls——浏览当前所在目录下的文件信息pwd——查看当前所在路径mkdir——创建目录rm——删除文件cp——将一个文件向另一个位置拷贝一份(注意:两个系统之间拷贝文件用scp)mv——一点一个文件或目录到另一个位置cd——改变当前所在路径,进入某个目录文件详解参考:https://blog.csdn.net/m0_46657980/art

2021-04-05 13:38:40 258 9

原创 Linux——网络(网络层—IP协议)

网络层:解析IP协议,地址管理,路由选择IP协议头格式详细介绍:4位版本号:指定IP协议的版本,对于IPv4来说就是4 4位头部长度:以4字节为单位,IP报文头部最小20字节,最大60字节 8位服务类型:3位弃用,1位固定0,4位服务类型:最小延时,最大吞吐量,最高可靠性,最小成本 16位总长度:限制IP博文最大长度必须小于64k(包含IP报头在内)UDP应用数据:64k-28 16位分片标识:标识当前数据分片属于哪个原始报文,用于接收端的数据分片重组MTU:最大传输单元,链路.

2021-03-01 17:16:50 160

原创 Linux——网络(传输层—UDP、TCP协议)

一、UDP协议1.UDP协议实现详细介绍:16位源端端口 + 16位对端端口:用于标识进程,描述主机上的通信两端进程 16位数据报长度:用于描述一个完整包含头部的UDP报文长度所能存放的最大大小是65535,也就要求一个UDP报文大小必须小于64k(因为UDP报头长度是8字节,因此要求sendto发送的数据大小必须小于64k-8) 16位校验和:采用二进制反码求和算法,校验接收到的数据与对方发送的数据是否一致 二进制反码求和算法:发送方最初校验和字段设置为0,然后将报文从起始处每个字

2021-02-09 14:26:23 207

原创 Linux——网络(应用层—HTTP协议、HTTPS协议)

1、应用层的作用负责应用程序之间的数据沟通2、应用层协议自定制协议:程序员自己设计的协议,涉及到数据传输性能、数据的解析性能序列化:将多个数据对象按照指定协议进行组织成为持久化存储或数据传输的二进制数制串反序列化:将二进制数制串按照指定协议进行解析得到各个数据对象典型序列化方式:结构体二进制序列化;protobuf序列化;json序列化知名协议:HTTP协议3、HTTP协议HTTP:超文本传输协议URL网址:URL-统一资源定位符,在网络中定位某台主机上的某个

2021-02-04 18:45:45 334 1

原创 Linux——线程详解

1. 线程的概念1.1 基本概念线程是进程中的一条执行流,是CPU调度的基本单位,一个进程中可以有多个线程Linux下的线程执行流是通过pcb实现的,且一个进程中可能有多个pcb,并且这些pcb共享同一个进程中的大部分资源,因此,也被称为轻量级进程Linux下,线程是CPU调度的基本单位,进程是系统进行资源分配的基本单位1.2 线程之间的独有与共享共享:虚拟地址空间(代码段和数据段)、文件描述符表、信号处理方式、工作路径独有:线程栈、寄存器、信号屏蔽字、优先级、errno、线程标

2021-01-11 21:41:03 375

原创 Linux——网络编程套接字

1.UDP协议UDP:用户数据报协议,不可靠的传输通信协议,应用于实时性要求大于安全性的场景——视频/音频数据传输特点:无连接,不可靠,面向数据报简单的UDP网络程序实现以及接口网络通信程序的编写都使用的是套接字接口——socket接口客户端:主动发起请求的一方,用户的一端服务端:被动接受请求的一方,向用户提供服务的一端在通信时,客户端的主要工作为:(1)创建套接字,使进程与网卡之间建立联系(2)为套接字绑定地址信息,每条数据中都有源端地址和对端地址,绑定的地址信息就是源

2021-01-11 15:19:08 214 1

原创 C++——多态

1.多态的概念不同的对象完成某个行为时会产生不同的状态,这种现象称为多态。例如:对于买票这件行为,普通人买的是全价票,而学生买的是半价票class Person{public: virtual void buyTicket() { cout << "普通票" << endl; }};class Student :public Person{public: virtual void buyTicket() { cout << "

2021-01-10 22:41:07 293

原创 Linux——网络(1)

1、网络背景计算机技术和通信协议是计算机网络产生与发展的两个最基本的内容网络:局域网:通过交换机和路由器连接在一起,覆盖范围在1KM以内城域网:覆盖范围在10~20KM广域网:将远隔千里的计算机都连在一起,覆盖范围在20KM以上因特网/互联网:具有国际范围的广域网以太网、令牌环网:比较典型的组网方式2、网络中的地址管理(1)IP地址IP地址:一台主机在网络中的标识IP协议有两个版本:IPv4和IPv6IPv4:unit32_t类型的整数(4个字节,32位的

2020-12-09 20:36:30 117

原创 C++——继承相关概念

1、继承的概念和定义继承是面向对象程序设计使代码可以复用的最重要的手段,继承是类设计层次的复用例如:class person{public: void print() { cout << "name:" << _name << endl; cout << "age:" << _age << endl; }protected: string _name = "peter"; // 姓名 int _ag

2020-12-06 14:27:53 151

原创 C++——stack, queue, priority_queue的介绍和模拟实现

1、容器适配器容器适配器是一种设计模式,这种模式是将一个类的接口转换成客户希望的另外一个接口例如:2、deque(双端队列)deque是一种双开口的“连续”空间的数据结构,可以在头尾两端进行插入和删除操作,时间复杂度为O(1)deque并不是真正的连续空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列的实现:指针数组(每一个元素缓冲区的首地址)+缓冲区(每一个缓冲区都是定长的,大小相同)deque的优点:增容代价小,头插头删效

2020-11-27 10:37:29 210

原创 Linux——信号

一、信号的概念信号是一个软件中断,通知进程发生了某个事件,打断进程当前的操作去处理这个事件Linux下的信号多种多样(共62种),可通过 kill -l 查看其中,1~31号信号为非可靠信号(有可能会产生信号丢失情况);34~64号信号为可靠信号(不会产生信号丢失情况)信号的生命周期:信号的产生,信号在进程中的注册,信号在进程中的销毁,信号的处理,阻塞二、信号的产生1、硬件Ctrl+c:中断当前操作Ctrl+z:停止当前操作Ctrl+\:退出当前进程2、软件.

2020-11-23 22:32:28 122 2

原创 C++——vector

一、vector的介绍vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储元素,因此可以采用下标对vector的元素进行访问,它的大小是动态改变的,vector使用动态分配数组来存储它的元素二、vector的使用1、构造函数...

2020-11-17 15:00:38 86

原创 C++——string类的模拟实现

1、string的基本概念string是表示字符串的字符串类,所以在模拟实现string类时,我们先定义一个String类class String{public: //成员函数private: //成员变量 char* _ptr; char* _size; char* _capacity;};_ptr表示字符串指针,_size表示字符串大小,_capacity表示容量2、成员函数的实现(1)构造函数String(const char* str = ""){.

2020-11-16 20:32:00 141

原创 Linux——进程间通信(管道、共享内存、消息队列、信号量)

进程间通信就是两个进程间的数据交换因为进程间具有独立性,每个进程访问的都是自己的虚拟地址,进程之间无法直接通信,因此需要操作系统提供中间媒介进行通信操作系统为进程间通信提供的方式:管道、共享内存、消息队列、信号量一、管道管道的本质:管道实际上就是内核中的一块缓冲区,多个进程通过访问同一个缓冲区,实现进程间的通信管道用于实现进程间的数据传输管道分类:匿名管道、命名管道管道符:| 作用:连接两个命令,将前边命令的输出结果交给后边的命令作为输入进行处理1、匿名管道...

2020-11-14 15:08:47 184

原创 Linux——基础IO

1、C标准库IO接口fopen, fread, fwrite, fseek, fclose接口实现方式:(1)FILE* fopen (char* filename, char* mode);mode: 文件打开方式——只读、只写、读写、追加写具体为:r :只读——若文件不存在,打开失败;若存在,则直接打开 r+ :读写——若文件不存在,打开失败;若存在,则直接打开 w :只写——若文件不存在,创建新文件;若存在,则清空文件原有内容打开文件 w+:读写——若文件不存在,创...

2020-11-06 11:44:10 908

原创 C++——模板最基本概念

1、泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础模板分为函数模板和类模板2、函数模板格式:template<typename T1, typename T2, ..., typename Tn>返回值类型 函数名(参数列表) {}简单举例:typename是用来定义模板参数的关键字,也可以使用class,不能使用struct代替函数模板它本身不是函数,是编译器使用方式产生特定具体类型函数的模具在编译阶段,.

2020-11-03 15:12:33 86

原创 C++——C/C++内存管理

1、C/C++内存分布栈:又叫堆栈,存储非静态局部变量、函数参数、返回值等,栈是向下增长的堆:用于程序运行时动态内存分配,堆是向上增长的内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统调用接口创建共享内存做进程间通信数据段:存储全局数据和静态数据代码段:可执行的代码/只读常量2、C语言中动态内存管理方式(malloc、calloc、realloc和free)malloc:只申请空间,不进行初始化calloc:申请空间+初始化.

2020-11-03 14:05:10 120

原创 C++——友元 & 内部类

1. 友元函数友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字举例:class Date{ friend ostream& operator<<(ostream& _cout, const Date& d); friend istream& operator>>(istream& _cin, Date& d);public: Dat.

2020-10-30 14:55:26 1009

原创 C++——static类成员

1、概念声明为static的类成员称为类的静态成员,用static修饰的成员变量称为静态成员变量,用static修饰的成员函数称为静态成员函数静态的成员变量一定要在类外进行初始化static成员的访问方式:通过对象访问: 对象 . static成员 或 对象 ->static成员 通过类名访问: 类名 ::static成员 2、特性(1)静态成员为所有类对象所共享,不属于某个具体的实例(2)静态成员变量必须在类外定义,定义时不加sta...

2020-10-30 14:36:27 257

原创 C++——构造函数之初始化列表

1、构造函数体赋值构造函数体中的语句只能将其作称为赋初值,而不能称为初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值2、初始化列表初始化列表是成员变量初始化的地方,初始化列表以一个冒号开始,以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式注意:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化【引用成员变量、const成员变量、自定义类型成员(该类没有默认构造函数)】

2020-10-30 13:24:13 523

原创 C++——拷贝构造函数&赋值运算符重载

1、拷贝构造函数拷贝构造函数也是构造函数,只是它的参数比较特殊:参数是对象拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般用const修饰),在用已经存在的类类型对象创建新对象时由编译器自动调用特征:拷贝构造函数是构造函数的一个重载形式 拷贝构造函数的参数只有一个且必须用引用传参,使用传值方式会引发无穷递归调用class Date{public: Date(int year = 1900, int month = 1, int day = 1) { _year

2020-10-30 10:55:12 622

原创 C++——运算符重载

运算符重载是具有特护函数名的函数,它的引入是为了增强代码的可读性函数原型:返回值类型 operator操作符 (参数列表)注意:不能通过连接其他符号来创建新的操作符,比如:operator@ 重载操作符参数不能全为内置类型,必须有一个类类型或者枚举类型的操作数 用于内置类型的操作数,其含义不能改变 作为类成员的重载函数时,其形参看起来比操作数数目少1个成员函数(操作符有一个默认的形参this指针,限定为第一个形参)有如下代码:class Date{public: Date..

2020-10-26 22:11:46 78

原创 C++——析构函数

析构函数与构造函数功能相反,析构函数不是完成对象的销毁,对象在销毁的时候回自动调用析构函数,完成类的一些资源清理工作。析构函数是特殊的成员函数,特征为:1.析构函数名是在类前面加上字符~2.无参数无返回值3.一个类有且仅有一个析构函数,若未显示定义,系统会自动生成默认的析构函数4.对象生命周期结束时,C++编译系统自动生成调用析构函数举例:​class String{public: String(const char* str = "jack") { _str =

2020-10-26 21:07:31 120

原创 C++——构造函数是开空间创建对象还是初始化对象?

1、构造函数的概念有如下代码:class Date{public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } void PrintDate() { cout << _year << "-" << _month << "-" << _day << endl; }

2020-10-20 21:47:16 356

原创 Linux——进程创建、进程终止、进程等待、进程程序替换

一、进程创建创建一个进程就是创建一个pcb,pcb在Linux下是一个task_struct结构体,放在内核中,只能通过调用接口实现创建1.pid_t fork(void);通过复制父进程创建一个子进程(复制了父进程pcb中的数据)代码共享,数据独有2.pid_t vfork(void);也是创建一个子进程,但是父进程使用vfork创建后,vfork的调用并不会立即返回(通常说会阻塞父进程),而是让子进程先运行,直到子进程退出或运行程序替换之后父进程才能运行(vfork创建的子进..

2020-10-13 23:50:11 285

原创 C++——类和对象中的隐藏参数(this指针)

1、this指针的引出#include<iostream>using namespace std;#include<string.h>#pragma warning(disable:4996)class Student{private: char _name[20]; char _gender[3]; int _age;public: void SetStudentInfo(const char* name, const char* gender, int

2020-10-04 19:27:38 996

原创 C++——不可错过的类和对象最基本概念

1、面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数逐步调用解决问题C++是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成(基于面向对象:既有面向对象,也有面向过程,因为C++要兼容C语言)面向对象和面向过程不是一门编程语言,而是一种解决问题的思路,C++中实现面向对象的编程思想,class定义的类是很关键的一步。2、类的引入在C语言中,结构体只能定义变量,不能定义函数在C++中,结构体内不仅可以定义变量,也

2020-10-04 18:25:43 198

原创 Linux——程序地址空间

程序地址空间地址:内存地址—对内存以字节为存储单元的一个编号,通过地址就能找到具体对应的内存单元我们所说的地址是一个虚拟的地址空间,只是一堆地址编号的描述,非物理内存地址;虚拟地址不具备存储能力,数据存储依然放到物理内存中进程中访问的地址都是虚拟地址,非物理内存地址程序地址空间也是一个虚拟地址空间,是操作系统为进程通过一个 mm_struct 结构体所描述的一个假的地址空间mm_struct (task_size, start_codde, end_code) 通过大小及区域的编号描述.

2020-10-04 16:31:12 118

原创 Linux——环境变量(终端shell中进行系统运行环境配置的变量)

1、基本概念环境变量就是一个变量,用于存储运行的环境参数shell中的普通变量,可以起到环境配置的作用,但无法进行数据传递。作用:(1)可以使系统环境配置更加灵活(2)可以通过环境变量向子进程传递数据2、常见环境变量PATH:存储程序运行默认的搜索路径HOME:指定用户的祝工作目录(即用户登录到Linux系统中时默认的目录)SHELL:当前shell,它的值通常是/bin/bash3、和环境变量相关的命令echo:直接打印某个变量内容export:设置一...

2020-10-04 14:50:57 746

原创 Linux——进程相关

1、基本概念进程就是运行中的程序,一个进程是一个程序对某个数据集的执行过程,是分配资源的最小单位。在操作系统角度,进程是操作系统对程序运行的动态描述。并行:多核CPU上,多个进程同时占据进行数据处理(比如:十个人并排过马路)并发:CPU资源不够的情况下,采用CPU分时机制,任务轮询处理(比如:十个人过独木桥)CPU分时机制:实现系统同时运行多个程序的技术,计算机上只有一个CPU,想要同时运行多个程序,就采用CPU分时机制,操作系统进行调度管理,让每个程序在CPU上只运行一个时间片(很短的

2020-09-29 17:26:01 140

原创 Linux——操作系统

1、冯诺依曼体系结构()

2020-09-29 14:55:01 89

空空如也

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

TA关注的人

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