
C++
文章平均质量分 64
私人的理解和感悟,错误望大家指正
、山有木兮木有枝
语法只是工具,算法才是灵魂
展开
-
C++ 异常捕获详解
为什么存在异常处理在程序运行时常会碰到一些错误,例如除数为 0、年龄为负数、数组下标越界等,这些运行时错误如果放任不管,系统就会执行默认的操作,终止程序运行,也就是我们常说的程序崩溃(Crash)。C++ 提供了异常(Exception)机制,让我们能够捕获运行时错误,给程序一次“起死回生”的机会,或者至少告诉用户发生了什么再终止程序。而 C++ 异常处理机制就可以让我们捕获并处理这些错误,然后我们可以让程序沿着一条不会出错的路径继续执行,或者不得不结束程序,但在结束前可以做一些必要的工作,例如将内存中原创 2021-04-28 17:40:27 · 11564 阅读 · 1 评论 -
C++ 内联函数浅析
概念C++中的函数是一个可以重复使用的代码块,CPU 会根据顺序一条一条地挨个执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。一个 C/C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来原创 2021-04-28 10:42:07 · 267 阅读 · 0 评论 -
C++抽象类浅析
抽象类如果在一个虚函数的后面写上 =0 ,则这个函数为纯虚函数。而包含纯虚函数的类叫做抽象类(也叫接口类)。特点包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现(重写)纯虚函数才能被实例化。class Car //这就是一个抽象类{ public: virtual void Dr原创 2021-04-27 13:19:26 · 421 阅读 · 0 评论 -
C++ 四大类型转换
类型转换为什么C++需要四种类型转换C风格的转换格式很简单,但是有不少缺点的:隐式类型转化有些情况下可能会出问题:比如数据精度丢失显式类型转换将所有情况混合在一起,代码不够清晰因此 C++ 提出了自己的类型转化风格,注意因为 C++ 要兼容C语言,所以 C++ 中还可以使用C语言的转化风格标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:- static_cast、reinterpret_cast、const_cast、dynamic_cast1.static_ca原创 2021-04-14 14:21:41 · 280 阅读 · 0 评论 -
浅析堆、栈、数据段、代码段、BSS的作用
动态区域(栈、堆)、静态存储区(数据段和程序段)堆(new、malloc出来的空间)类成员变量存放在堆区,所有类的实例和数组都是在堆上分配内存的,堆内存由存活和死亡的对象,空闲碎片区组成,对象所占的堆内存是由自动内存管理系统回收;堆允许程序在运行时动态地申请某个大小的内存。一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。栈(定义局部、临时变量时系统自动分配空间)由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。数据段: 由三部分转载 2021-04-14 14:15:25 · 777 阅读 · 0 评论 -
C++ 回调函数浅析
简述能来了解回调函数,说明电脑前的你必定对指针有了比较深入的见解了吧,我们知道函数的参数有很多,整形、浮点、指针、对象等等。每一个函数其实都有属于它自己的地址(函数指针就指向函数的地址),当需要调用的时候其实也是在访问它的地址,而指针既然能作为函数参数,那么函数的地址当然也可以作为函数参数。举个例子:#include<iostream>#include<string>using namespace std;typedef void(*callback)(string);原创 2021-04-02 17:40:34 · 353 阅读 · 0 评论 -
C++ 单例模式/类型转换/特殊类设计
单例模式概念常用的一种典型的设计模式,单例模式的方法创建的类在当前进程中只有一个实例,一份资源只能被申请加载一次。实现饿汉模式:在资源的程序还在初始化的时候就会加载,保证后面能够直接进行使用。(不涉及线程安全问题 )优:使用的过程流畅缺:可能会加载很多不需要的资源,导致程序初始化缓慢懒汉模式: 资源在使用的过程中发现还没加载则申请加载。(游戏中常用且涉及线程安全)优:程序初始化快缺:使用过程中衔接不流程,并且在第一次运行某个模块时会比较缓慢,因为此时正在加载相应的资源总结对比一下饿原创 2020-07-25 00:02:41 · 347 阅读 · 0 评论 -
C++ 内存泄漏和智能指针介绍
智能指针为什么要使用智能指针因为 C++ 不像 Java 一样具有垃圾回收机制(gc),但是又需要释放内存,防止内存泄漏。智能指针的作用是管理一个指针,主要用于防止内存写了,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。1.auto_ptrauto_ptr 的大概流程就是使用该指针去代替原生指针管理空间,而后将原生指针置空,这样在 auto_ptr 的生命周期到了以后会去调原创 2020-07-23 23:27:43 · 441 阅读 · 0 评论 -
C++ 中的线程库和 lamber 表达式
lambeda表达式语法格式lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }1.lambda表达式各部分说明[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量供 lambda 函数使用。(parameters):参数列表。与普通函数的参数列表一致,如果不原创 2020-07-22 22:47:40 · 678 阅读 · 0 评论 -
哈希 (hash) 闭散列和开散列的存储方式以及对应哈希冲突的解决办法
哈希的概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为 O(N),平衡树中为树的高度,即O(LogN),搜索的效率取决于搜索过程中元素的比较次数。我们理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数 (hashFunc) 使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:插入元素根据待插入元原创 2020-07-11 22:37:55 · 1613 阅读 · 0 评论 -
Hash 位图和布隆过滤器的原理的使用解析
位图这里借用鹅厂一道经典的面试题来开头:如果给你 40 亿的不重复的无符号乱序排列的整数,再给你一个无符号整数,如何快速判断这个数是否在这 40 亿个整数中?首先我们先算一算存储 40 亿个数所需要的空间大小,unsigned 是 4 个字节,也就是 40 亿 * 4 = 160 亿的字节,2 ^ 30 = 1G, 算下来接近 15G,这个代价未免也太大了,所以我们需要一个更加稳妥的方式去解决它。这里我们就用到了 hash 位图。原理一个字节是 8 个 bit,所以我们可以开足够大小的 bi原创 2020-07-07 23:17:20 · 715 阅读 · 0 评论 -
C++ 中 map 和 set 的用法以及概念解析/含 map中operator[] 的用法
键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量<key,value>,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。SGI-STL中关于键值对的定义template <class T1, class T2>struct pair{ typedef T1 fir原创 2020-07-02 11:11:23 · 867 阅读 · 0 评论 -
C++ 多态详解(含重载、覆盖(重写)、隐藏(重定义)的对比)
多态概念也就是多种形态,具体就是当要去完成某个行为时,不同的对象完成时会产生出不同的状态。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了 Person。Person 对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个必备条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写虚函数的重写(覆盖)派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的原创 2020-06-07 23:03:23 · 358 阅读 · 0 评论 -
C++普通继承和虚继承详解
继承继承概念所谓的继承就是一个类继承了另一个类的属性和方法,这个新的类包含了上一个类的属性和方法,被称为子类或者派生类,被继承的类称为父类或者基类。继承特点子类拥有父类的所有属性和方法(除了构造函数和析构函数)。子类可以拥有父类没有的属性和方法。子类是一种特殊的父类,可以用子类来代替父类。子类对象可以当做父类对象使用。继承格式class 派生类类名: 继承方式 基类名{成员变量和成员函数的声明}继承方式: public protected privat原创 2020-06-07 22:18:46 · 6617 阅读 · 1 评论 -
C++ 模拟实现 vector
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<list>#include<assert.h>using namespace std;namespace My_Vector{ template<class T> class vector { public: typedef T* iterator; typedef co原创 2020-05-27 22:43:17 · 285 阅读 · 0 评论 -
C++ 模拟日期类的实现
#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class Date { //友元函数 friend ostream& operator<<(ostream& out, const Date& d); friend istream& operator>>(istream& in, Date& d);private:原创 2020-05-19 20:17:26 · 333 阅读 · 0 评论 -
C++ 模拟 string 的实现
#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<assert.h>#include<string>using namespace std; namespace MyString{ class string { public: friend ostream& operator<< (ostream& out, const string& s);原创 2020-05-12 23:10:15 · 209 阅读 · 0 评论 -
C++ 中 string 的常用用法和 迭代器详解
string的常用用法#include<iostream>#include<string>using namespace std;void String1(){ 1. 字符串的初始化和拷贝构造 string s1("hello"); //初始化s1 string s2 = s1; //拷贝构造s2 string s3(s2, 2); // 从...原创 2020-05-03 20:07:54 · 1715 阅读 · 0 评论 -
C++ static 成员、new / delete /特化模板/模板分离编译的详解
static概念声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。特性静态成员为所有类对象所共享,不属于某个具体的实例静态成员变量必须在类外定义,定义时不添加static关键字类静态成员即可用类名::静态成员或者对象.静态成员来访问静态成员函数没有隐藏...原创 2020-04-25 21:31:07 · 833 阅读 · 0 评论 -
C++ 初始化列表和友元详解
初始化列表在构造函数的时候,类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量const成员变量自定义类型成员(该类没有默认构造函数)格式:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。除了以上三种外也能用此方式来初始化成员变量class B{public: B(int a) //没有默认构造函数...原创 2020-04-25 20:23:53 · 344 阅读 · 0 评论 -
C++ 拷贝构造函数、赋值运算符、const 修饰 this 指针 详解
拷贝构造构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。特征拷贝构造函数也是特殊的成员函数,其特征如下:拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。具体实现class Date{public: Date(int year...原创 2020-04-15 11:16:48 · 356 阅读 · 0 评论 -
C++ 构造函数和析构函数
构造函数struct Time{public: Time() { _hour = 0; _minute = 0; _second = 0; } void print() { cout << _hour << "-" << _minute << "-" << _second << endl...原创 2020-04-14 22:21:27 · 208 阅读 · 0 评论 -
C++中的 类和 this 指针详解
类c 和 c++ 的区别C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。类的定义//struct className //定义的默认为公有 class className //定义的默认为私有{ // 类体:由成员函数和成员变量组成 }; //...原创 2020-04-14 21:32:29 · 456 阅读 · 0 评论 -
C++中的引用、auto、范围 for 详解
引用概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。格式:类型& 引用变量名(对象名) = 引用实体;一个变量可以有多个引用,但一个引用只能专属于一个变量int b = 10;int a = 5;int& c = b; //此处c就...原创 2020-04-14 20:41:30 · 3663 阅读 · 0 评论 -
C++的缺省函数、函数重载、extern 的作用及其原理
缺省函数概念:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。void TestFunc(int a = 0) { cout<<a<<endl; }int main(){ TestFunc(); //没有传参时,使用参数的默认值 TestFunc(10);...原创 2020-04-13 22:36:58 · 479 阅读 · 0 评论 -
C++命名空间、输出函数的作用及使用
命名空间概述在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。命名空间的创建namespace N1 //命名一个N1的空间{ //命名空间内不仅可以定义函数,也能够定义成员 //而且不...原创 2020-04-13 22:05:31 · 641 阅读 · 0 评论