
C++
文章平均质量分 92
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生
安权_code
写出诗一样的代码
展开
-
C++_单例模式
在C++中有许多设计模式,单例模式就是其中的一种,该模式主要针对类而设计,确保在一个进程下该类只能实例化出一个对象,因此名为单例。而单例模式又分为饿汉方式和懒汉方式,饿汉方式指的是只要发出了对该类的需求,就会实例化对象。懒汉方式指的是即使发出了对该类的需求,但是不会立刻实例化对象,等到真正用到该对象时才会实例化对象。原创 2024-07-21 17:29:49 · 3704 阅读 · 0 评论 -
C++_强制类型转换
C++为了规范强制类型转换的可观性与安全性,引入了4种强制类型转换符,他们分别是:static_cast、reinterpret_cast、const_cast、dynamic_cast。原创 2024-03-14 16:49:22 · 945 阅读 · 1 评论 -
C++_智能指针
C++的智能指针是普通指针“升级版”,采用了面向对象的思想对普通指针进行了又一层封装,将原本是内置类型的普通指针封装成用户自己定义的一个类对象。智能指针存在的原因:普通指针在进行申请空间时,需要手动释放该指针,有些场景下用户可能来不及释放导致内存泄漏,而一个类对象在销毁时是一定会调用该对象的析构函数的。所以把释放指针的动作交给类的析构函数处理则指针所指向的空间一定会得到释放,这就是智能指针的核心思想。原创 2024-03-13 23:31:02 · 860 阅读 · 1 评论 -
C++_异常
C++的异常是一种处理程序bug的方式,如今面向对象的语言基本都是用异常处理错误的,因为他可以帮助程序员快速定位错误的根源。当一个函数或者是一段代码发现了自己处理不了的错误就可以将该错误抛出,又称异常抛出,由外部的调用者或间接调用者捕获该错误,又称异常捕获。原创 2024-03-12 20:06:17 · 1004 阅读 · 0 评论 -
C++_包装器
C++11的包装器,总称为function包装器,而包装器又称适配器,顾名思义包装器主要是用于包装函数的,实际上是将函数指针、仿函数类、lambda函数进行了又一层的封装。原创 2024-03-11 16:58:34 · 1357 阅读 · 1 评论 -
C++_lambda表达式
C++11推出lambda表达式,lambda表达式实际上是一个匿名函数,他的具体书写格式如下:lambda格式:[capture-list] (parameters) mutable -> return-type { statement }原创 2024-03-10 19:54:15 · 988 阅读 · 1 评论 -
C++_可变参数模板
C++11引入了可变参数模板,他的作用是可以让创建的函数模板或者类模板的模板参数可以接收任意数量参数,在C++11前,只能手写固定数量个模板参数,并且只能接收与之对应数量的参数,有了可变参数模板后,代码就变得更加的灵活了。原创 2024-03-09 19:13:14 · 1759 阅读 · 0 评论 -
C++11_右值引用与移动语义
到了C++11后,引入了右值引用的概念,即给右值取别名,无论是左值引用还是右值引用实际上都是给对象取别名,只不过定义左值与右值的概念不同。原创 2024-03-08 20:46:04 · 1284 阅读 · 0 评论 -
C++11经典语法
C++通常被分为两个大标准,即C++98和C++11。对于C++98而言,C++11在其基础上做了大量的更改与优化,改动之大以至于C++11更像一门“新语言”,不过C++11确实在使用层面得到了很大的提升,语法更加的稳定安全且功能强大,大幅度的提供了程序员的开发效率。原创 2024-03-07 20:36:21 · 868 阅读 · 0 评论 -
C++_布隆过滤器
布隆过滤器是一种概率型数据结构,采用的是哈希思想,他在位图的原有基础上做了升级,因为位图处理不了数据为字符串的情况,而布隆过滤器可以。布隆过滤器的作用是能够快速的判断某个数据存在与否,他也是通过哈希函数找到映射在位图上的位置,但是位图只映射一个位置,而布隆过滤器能够映射多个位置,这也是布隆过滤器和位图的区别所在。原创 2024-03-06 20:33:43 · 923 阅读 · 0 评论 -
C++_位图
位图采用的是哈希表的思想,哈希表的映射层面是在字节上,而位图的映射层面就是在bit位上。由于bit位所能展现的信息无非只有‘1’和‘0’,所以位图相比于哈希表,前者的功能比较单调,只能判断数据存在与否,若数据存在则bit位置为‘1’,不存在则为‘0’,因此位图使用的场景也不允许有重复数据的出现。原创 2024-03-05 20:27:45 · 838 阅读 · 0 评论 -
C++_哈希表
哈希表也是一种存储信息的结构,他是通过映射数据本身从而得到一个“影子位置”,该“影子位置”就是哈希表中存储该数据的位置,因此哈希表的优势在于查找数据时,并不会像其他顺序结构、树结构一样,将要查找的数据和载体中的数据直接比较,而是根据数据找到其在哈希表中的映射位置,然后直接用下标访问哈希表的映射位置,让数据与此位置的值进行对比即可。原创 2024-03-04 21:22:18 · 1708 阅读 · 0 评论 -
C++_红黑树
在C++中,红黑树是二叉搜索树的另一种优化版本,他与AVL树的区别在于保持树的平衡方式不同,AVL树保持平衡的方式是在节点中多存储一个成员来记录平衡因子,红黑树保持平衡的方式也是增加了一个成员,但是该成员的作用是记录节点的两种状态(颜色):红色--黑色。当然只记录颜色并不能保持平衡,红黑树还规定最长路径的节点个数不会超过最短路径的节点个数的两倍,因此红黑树不会因为插入有序数据而演变成“单支树”。原创 2024-03-03 21:18:43 · 1171 阅读 · 0 评论 -
C++_AVL树
在C++中,AVL树在每一次插入新节点的同时,会自动调整该树的高度,即不会让每个节点的左右子树高度的绝对值不超过1,因此哪怕面对有序数据的插入也不会让树变成”单支树“,可以使查找数据的效率始终保持在O(log N)。原创 2024-03-02 22:49:13 · 667 阅读 · 0 评论 -
C++_map与set
C++中的map和set容器属于关联式容器,与序列式容器不同的地方在于(序列式容器即vector、list,其底层是由线性数据结构实现的容器),关联式容器存储的是键值对,键值对是一个结构体,他只有两个成员变量:key,value,并且key和value是一一对应的,key表示键值,而value就是key对应的数据。原创 2024-03-01 19:56:46 · 1087 阅读 · 0 评论 -
C++_二叉搜索树
二叉搜索树是一颗二叉树,他跟普通的二叉树的区别在于:二叉搜索树的节点是按照特定规则进行摆放的。二叉搜索树的优势在于:无特殊情况下,其增删查改数据的时间复杂度可以达到O(log N),这个效率相比于线性表的效率,前者明显高出很多。原创 2024-02-15 13:54:55 · 920 阅读 · 0 评论 -
C++_多态
在C++中,多态指的是调用同一个类的成员函数时,会产生两种不同的结果,因此多态又称多种形态。实现多态的前提是: 1、两个类必须满足继承关系。 2、必须通过基类的指针或引用去调用该类的成员函数,并且这个成员函数是被virtual修饰过的虚函数,还得完成虚函数的重写。原创 2024-02-05 20:08:14 · 650 阅读 · 0 评论 -
C++_list
list是STL(标准模板库)中的八大容器之一,而STL属于C++标准库的一部分,因此在C++中可以直接使用list容器存储数据。list实质上是一个带头双向循环链表,这也使得他能够在常数的时间复杂度范围内插入和删除数据,缺点是不能像数组那样进行元素下标的随机访问。原创 2024-01-30 19:55:18 · 932 阅读 · 0 评论 -
C++_继承
在C++中,继承一般是作用于类的,继承的逻辑和函数复用的逻辑有些相似,比如一个类B继承了类A,那么可以在类B中直接访问类A的成员(私有成员除外),通常把类B叫做派生类(子类),而类A叫做基类(父类),并且抽象的把类A看作是类B中的一部分。原创 2024-01-23 15:26:46 · 910 阅读 · 0 评论 -
C++_模板的特化
大多数情况下模板可以解决许多重复性工作,因为把不同的类型传给模板参数后,编译器就会自动生成该类型的函数或类,但是如果传给模板参数的类型是特殊类型(比如:指针类型),那么最终的结果可能会有所偏差,原因就是该模板的内容实现逻辑是按照普通类型的实现逻辑进行的。这时候如果传指针类型给到该模板,则需要先对指针进行解引用后才能走普通类型的实现逻辑,如果直接对指针本身进行操作则结果会发生错误。原创 2024-01-17 15:59:18 · 1652 阅读 · 0 评论 -
C++_vector类
vector类是STL(标准模板库)中的八大容器之一,而STL属于C++标准库的一部分,所以可以直接使用vector。他的作用类似于数组,是用一段连续的空间来存储元素,因此可以支持下标访问各个元素,其中元素的类型可以是int、char...类型以及自定义类型,所以vector类实际上是一个类模板。但是vector类对空间内存的管理比数组更加严格,且使用起来较数组更简便,因为vector是一个类很多功能都已封装完成。原创 2024-01-10 21:13:07 · 1082 阅读 · 0 评论 -
C++_string类
C++中的string类是专门用于处理字符串的,比如对字符串的增删查改、以及对字串进行各种操作,当然,上面说到的这些在c语言中一样可以使用字符数组实现,那为什么还要费尽心思的去专门实现一个类来解决字符串相关的问题呢,原因就是C++中的string类对边界访问更严格,并且用string类操作字符串相对于c语言中操作字符数组更加简便。原创 2024-01-04 22:16:33 · 1117 阅读 · 0 评论 -
C++_模板
在C++中,模板分为函数模板和类模板,而模板的作用就是避免了重复的工作,把原本是程序员要做的重复工作交给了编译器去做。比如实现两个变量的交换函数,如果这两个变量是int类型则需要写一个int类型的交换函数,若是double类型则要再写一个double类型的交换函数,这样一来增加了很多反复的工作,若用函数模板就能解决以上问题,只需要写一个交换函数的模板,不管是什么类型,都可以通过该模板实现两个变量的交换。原创 2023-12-31 14:42:55 · 877 阅读 · 0 评论 -
C++_new和delete
在C++中有一套属于自己的内存管理方式,即new(申请一块空间),delete(归还一块空间)。通过操作new和delete,就可以进行堆上的动态内存管理,他们的用法与c语言中的malloc和free相似,都是申请一块空间后,用一个指针来接收这块空间的地址,归还空间就是用delete/free“修饰”该指针。不同的是:new和delete是操作符,而malloc和free是函数。原创 2023-12-27 21:27:43 · 1756 阅读 · 0 评论 -
C++_运算符重载
C++中运算符重载的作用是可以让自定义类型的对象也可以进行相互运算,在c语言中,只有内置类型的变量或者常量可以使用运算符进行简单的计算,比如:定义两个变量int a = 12;int b = 20;可以实现a+b,a-b,a==b....,原因是a和b的类型都是内置类型(即系统提供的数据类型)。若要实现自定义类型对象的运算,只能把这些运算符封装成一个函数,在进行对对象的运算时调用对应的运算符重载函数,实现对象之间的运算。(为什么叫重载,因为在底层中,运算符本身也是一个函数,只是只针对内置类型做运算,现如今我原创 2023-12-23 14:27:49 · 1162 阅读 · 0 评论 -
C++_拷贝构造函数
拷贝构造函数的作用是实现对象的拷贝,通常是把一个已经存在的对象的成员变量拷贝给一个刚被实例化出来的对象,以拷贝的形式完成对该对象的初始化。因此拷贝构造函数其实是构造函数的一种重载的形式,而且进行对象拷贝时由系统自动调用拷贝构造函数。拷贝构造函数的函数名与类名相同,且没有返回类型,函数只有一个形参,通常会把形参的类型设为该类类型的一个引用,表示形参为实参的一个”别名“。原创 2023-12-19 20:28:48 · 984 阅读 · 0 评论 -
C++_构造函数与析构函数
构造函数和析构函数都是属于类中的成员函数,在实例化一个对象时系统会自动调用该对象的构造函数,因此他常用于初始化对象成员变量,一个对象在其生命周期中只会调用一次构造函数。而析构函数与构造函数作用”相反“,他是在对象销毁时自动被系统调用的,所以他的任务是清理、释放对象申请的空间资源,一个类中只能有一个析构函数。原创 2023-12-15 18:37:37 · 1809 阅读 · 0 评论 -
C++_类的定义和使用
C++的类跟c语言中的结构体在概念上是一样的,只不过在c语言中叫结构体,而在C++中叫类。c语言中的结构体内只能定义变量,而C++在此基础上升级后,类里面可以定义变量和函数,并且把类中的内容叫做类的成员,类中的变量叫做成员变量,类中的函数叫做成员函数。原创 2023-12-12 19:22:52 · 4088 阅读 · 0 评论 -
C++_引用
在C++中,引用的符号为”&“,和取地址的符号是一样的。使用引用的前提是必须得有一个变量作为引用的对象,通常我们把对一个变量的引用叫做给该变量“取别名”,因此调用该变量的“别名”实则就是调用该变量。而且“别名”与“本名”之间建立了联系,既对“别名”的修改会影响“本名”,对“本名”的修改也会影响“别名”。注意:在同一作用域下,一个变量可以有多个“别名”,但是一个“别名”只要确定有了一个“本名”后就不能再成为其他本名的“别名”,通俗点来说就是“别名”已经确定“指向”一个“本名”后,就不能更原创 2023-12-09 13:27:36 · 1336 阅读 · 0 评论 -
C++_函数重载
函数重载的意思就是可以有多个同名函数存在,但是这些同名函数的参数列表有着不同情形,以便区分。在C++中,支持在同一作用域下可以声明、定义多个同名函数,但是这些函数的形参类型,类型顺序以及参数个数三者中至少有一个是有区别的。原创 2023-12-08 14:07:55 · 687 阅读 · 0 评论 -
C++_命名空间(namespace)
C++作为c语言的“升级版”,其在语法上相对于c语言有了诸多升级、优化,比如在C++中有一个全新的概念:命名空间(namespace)。在使用C++时,该语法很好的解决了对标识符命名重名的问题。在使用c语言写代码时,常常会遇到标识符命名重名的问题。比如我们自己写了一个函数,该函数名可能与库函数中的某个函数发生重名,或者与他人一起写项目时,也存在与他人代码中的标识符同名的现象,然而以上情况的解决方法只有对标识符进行改名。原创 2023-12-06 16:39:03 · 1717 阅读 · 0 评论