![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 59
Mikoto_10032
这个作者很懒,什么都没留下…
展开
-
C++手撕一个线程池
线程池总体流程线程池:一次性创建多个子线程,主线程(生产者)负责接收客户端的链接并创建socket对象然后加入到仓库中,然后子线程(消费者)从仓库中获取socket对象进行服务,当客户端退出时,子线程不销毁而是继续从仓库中获取下一个socket对象进行服务。这种网络编程的优点是限制客户端的链接数量,不需要创建销毁线程,节约了线程销毁和创建的时间,同时空闲的线程会进入休眠,不会与工作线程竞争。所以它的应用范围更广,编程难度更高。线程池中的主线程抓取任务到仓库和子线程消费任务的模块,与消费者与生产者模型非原创 2021-03-19 15:58:32 · 427 阅读 · 1 评论 -
c++实现log日志文件
1、在项目的运行过程中需要记录或现实代码的执行流程和错误信息,但在不同的阶段需要的功能不同:调试阶段:需要在屏幕显示执行过程和错误信息运营阶段:需要在文件中记录下来执行过程和错误信息2、根据错误原因一般段错误分为收下四个等级:致命错误 LOG_FATAL警告 LOG_WARNING错误 LOG_ERROR提示信息 LOG_INFO3、如何实现文件和终端都可写入的?因为在Linux系统下一切皆文件,终端的文件指针就是stdout。使用fprintf和FILE可以实现既可以现实到屏幕,也原创 2021-03-19 17:25:08 · 2243 阅读 · 0 评论 -
C++类的继承方式与特点,不同继承方式对成员的影响
一、类的继承 1、当面临一个问题时,现在的类的是否能解决部分问题,如果可以则把现在的继承后再进行拓展,来缩短解决问题的时间、降低解决问题的难度(继承就是为了代码复用)。 2、当面临的问题比较复杂时,可以把问题分层,每层设计一个类,然后在通过继承进行汇总,最终得到一个可以解决问题的类,以此降低解决问题的难度。二、继承的基本语法1、继承表 一个类可以继承多个类,被继承的类叫做父类(基类),继承者叫子类(派生类),每个父类都可以有不同的继承方式。class 子类:继承方式1 父类1,继承方式2原创 2021-01-21 19:55:15 · 643 阅读 · 0 评论 -
C++中构造函数和析构函数是否可以是虚函数,为什么?
构造函数和析构函数是否可以是虚函数,为什么?1. 为什么构造函数不能为虚函数?虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。2. 为什么析构函数可以为虚函数,如果不设为虚函数可能会存在什么问题?首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。举例说明:子类B继承自基类A;A *p = new B原创 2021-01-21 19:52:08 · 984 阅读 · 0 评论 -
C++各类运算符的重载(单双目、输入输出、前++、后++)
一、运算符重载 在C++中会把运算符当做函数来处理 ,当我们使用运算符时,编译器其实是把运算符翻译成函数,由于C++支持函数重载,所以C++中的运算符也是可以重载的,这样可以对类对象进行定制操作,从而简化操作、提高代码的可读性,如:string类就是一个支持众多运算符的字符串类。 A a,b; 当对象支持+运算符时:a+b;成员函数:const A& operator+(cosnt A& b);全局函数:const A& operator+(const A&原创 2021-01-11 19:36:54 · 1389 阅读 · 1 评论 -
C++类中static修饰的静态成员与单例模式(饿汉、懒汉模式的实现)
一、静态成员静态成员变量被static修饰过的类成员变量,叫静态成员变量,这成员变量的特点是存储空间为bss段或data段,该变量只会被创建出一份,为所有类对象共享。静态成员变量属于类,而不是某个类对象。静态成员变量的声明与定义: 在类中静态成员变量仅仅是声明,定义、初始化必须在类外,定义时不再需要static关键字。格式:类型 类名::变量名注意:静态成员变量依然受访问控制符的限制,private/protected权限的静态成员变量依然只能在类内访问,public原创 2021-01-11 19:31:04 · 786 阅读 · 0 评论 -
C++基础知识之类中const修饰的常函数
常函数定义 在函数的参数列表和函数体之间加使用const修饰的函数,这种叫做常函数,该const修饰的就是this指针。特点 不能在常函数内修改成员变量的值,普通类对象可以调用常函数,普通成员函数也可以调用常函数,但是常函数只能调用常函数。 如果在常函数中真的修改某个成员的值,那么该成员需要用mutable修饰。注意:常对象只能调用常函数,不能调用普通的成员函数。#include <iostream>using namespace std;class Test原创 2021-01-11 19:26:48 · 117 阅读 · 0 评论 -
参照string类,实现一String类的构造函数、析构函数、拷贝构造、赋值。
参照string类,实现一String类的构造函数、析构函数、拷贝构造、赋值。#include <iostream>#include <string.h>using namespace std;class String{ char* c_str;public: String(const char* str) { c_str = new char[strlen(str)+1]; strcpy(c_str,str); } ~String(void)原创 2021-01-11 19:13:30 · 149 阅读 · 0 评论 -
C++成员函数是如何区别那个对象在调用它?
this指针 类的成员函数存储在代码段中,类的成员变量存储在每个类对象中,所有类对象共享一份成员函数。 成员函数是如何区别那个对象在调用它? 当使用类对象调用成员函数时,编译器会把对象的地址隐式传递给成员函数,每个类成员函数都隐藏着一个参数this指针 在成员函数中之所以能直接访问成员变量就是隐藏着this指针,当在成员函数中调用其它成员函数时,也会把this指针传递过去。注意:this指针是隐藏的,但也可以显示地使用C++类中的静态成员函数和友元是没有隐藏的this指针的原创 2021-01-11 19:06:39 · 633 阅读 · 0 评论 -
C++类四大隐藏函数详解(构造函数、析构函数、拷贝构造、赋值函数)
构造函数传送门一、析构函数1、什么是析构函数 与构造函数一样也是一种特殊的成员函数,它会在对象释放的时候自动调用,负责一些收尾工作,如:保存数据、释放资源等。2、函数格式~类名(void){ }3、析构函数的任务 负责释放在构造函数中获取到的所有资源。 执行过程: 1、先执行析构函数本身代码 2、调用成员变量的析构函数 3、调用父类的析构函数注意:析构函数与构造函数的执行顺序刚好相反#include <iostre原创 2021-01-11 19:02:26 · 996 阅读 · 0 评论 -
面向对象编程,类与对象的详细解答(构造、析构函数)
一、面向对象编程 面向过程编程:关注于解决问题的方法、步骤。 面向对象编程:关注于谁能解决问题(类),以及解决问题需要的数据(成员变量),以及解决问题需要的技能(成员函数)。 抽象:想象出一个能解决问题的对象(观察、想象),分析出解决问题需要的属性(成员变量)和行为(成员函数)。 封装:把抽象的结果分装成类(数据类型),并设置上相应的访问权限。 使用封装的类实例化对象,调用对象的成员函数与成员变量相互作用达到解决问题的目的。 继承:在解决问题之前,先寻找有没有能解决部分问题的类,原创 2021-01-08 20:00:07 · 361 阅读 · 0 评论 -
如何使用C++中的引用,与指针的区别所在
引用1、什么是引用:引用就是取别名(外号) 引用就是用一个新的标识符与另一个标识符的内存建立绑定关系,从而使一块内存对应多个标识符。2、引用的基本特性 1、引用必须初始化,也就是必须有引用目标。 不存在空的引用,但有可能存在悬空引用(变量已经销毁,但名还留着)。 2、可以引用无名对象或临时对象,但必须使用常引用。 3、引用不能更换目标 引用一旦定义、初始化完成后就和普通变量一样,它就代表了引用目标,一旦引用终身不能更换引用目标(没有这种语法)原创 2021-01-05 20:55:36 · 106 阅读 · 0 评论 -
C++中的四种强制类型转换(静态、动态、去常、重解释)
强制类型转换 C++中有一套更安全的强制类型转换,分别是1、静态类型转换 static_cast<目标类型>(源类型) 源类型和目标类型只要有一个方向可以隐式转换,那么两个方向都可以做静态类型转换,如果不能则报错#include <iostream>using namespace std;int main(int argc,const char* argv[]){ float num = 10; cout << sizeof(static_原创 2021-01-05 20:54:05 · 1329 阅读 · 0 评论 -
C++中的堆内存管理new/delete
C++的堆内存管理1、在C++中使用new/delete管理堆内存 相当于C语言中的malloc/free 使用方法: new 类型; new会自动计算类型所需要的字节数,然后从堆内存申请响应字节数的内存,并返回内存块的首地址(带类型地址)。 delete 地址; 释放堆内存中的内存块; 注意:new/delete与malloc/free不能混用,因为new和delete除了管理堆内存还有其他的工作要做。2、数组的分配与释放原创 2021-01-05 20:50:09 · 147 阅读 · 0 评论 -
带你掌握C++的重载、内联函数以及与C函数的区别
C++函数与C函数的区别1、函数重载 1、什么是函数重载 在同一作用域下,形参列表不同的同名函数构成重载关系,且不会冲突 调用函数时,编译器会根据实参的数据类型调用合适的函数 2、重载实现的机制 C++代码在编译时函数的参数类型会添加到函数名中,也就是C++的函数名在编译时经历了换名的过程,借助这个方式实现了函数的重载 由于C++和C函数的编译机制不同,所以C++代码不能调用C编译器所编译出的函数。 3、extern “C” {}原创 2021-01-05 20:47:19 · 198 阅读 · 0 评论 -
如何使用C++的名字空间(namespace)
名字空间1、为什么需要名字空间 在项目中函数名、全局变量、结构、联合、枚举、宏等,非常有可能有命名冲突,而C++之父设计名字空间就是为了解决这些命名冲突,名字空间可以把这些命名划分到不同的逻辑空间中,从而解决命名冲突。2、定义名字空间namespace name{ 定义变量 定义函数 定义类、结构、联合、枚举} 注意:名字空间可以重复,同名的名字空间会自动合并#include <iostream>namespace n1{ int num = 10原创 2021-01-05 20:37:33 · 385 阅读 · 0 评论 -
轻松了解C++与C语言的不同之处
一、C++介绍 贝尔实验室本贾尼·斯特劳斯特鲁普,于1979年在分析linux系统分布内核流量分析时,希望有一个更加模块化的工具,于是他为C语言增加了类的机制(面向对象),于1983年完成了C++的第一个版本。特点 1、C++完全兼容C语言的所有内容 2、支持面向对象的编程思想(抽象、封装、继承、多态) 3、支持函数、运算符重载 4、支持泛型编程、模板技术 5、支持异常处理机制 6、类型检查更严格二、第一个C++程序1、文件扩展名 .cpp .cc .原创 2021-01-05 20:28:29 · 95 阅读 · 0 评论