![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 69
文丑颜不良啊
平平无奇的Java开发小白
展开
-
纯虚函数和抽象类以及实例
抽象类当把一个类作为一个类型时,都假设程序将创建这种类型的对象,但是,在某些情况下,定义一个程序员永远不打算实例化任何对象的类也是非常有用的,这样的类称为抽象类,因为通常抽象类在类的继承层次结构中作为基类,所以我们有时也称这种类为抽象基类。这种类不能用来实例化对象,抽象类其实是不完整的,其派生类必须在这些类的对象实例化之前定义那些缺少的部分,比如实例化对象。构造抽象类的目的是为其他类提供适...原创 2019-11-30 23:17:33 · 933 阅读 · 0 评论 -
String类的实现
#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;class String{ friend std::ostream& operator << (std::ostream& os, const String&am...原创 2019-11-26 11:52:04 · 125 阅读 · 0 评论 -
C++三大特性:封装、继承、多态
封装封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单元,并尽可能隐藏对象的内部细节。即把对象的全部属性和其所能提供的全部服务结合在一起,形成一个不可分割的独立单位,称为“类”,然后对外隐蔽内部的细节,只保留有限的对外接口使之与外部发生联系。继承继承是面向对象技术能够提高软件开发效率的重要原因之一,其定义是:特殊类的对象拥有其一般类的全部属性与服务,称作特殊...原创 2019-11-24 14:44:57 · 174 阅读 · 0 评论 -
map的实现机制、map与set的区别
首先需要知道,STL中标准关联容器set、multiset、map、multimap的内部采用的是一种非常高效的平很检索二叉树,即红黑树。红黑树是一种平衡二叉树,但是红黑树的统计性能要好于一般的平衡二叉树。红黑树与一般的平衡二叉树相比,红黑树基本上是平衡的,而AVL树是完全平衡的。而为什么map和set的底层使用红黑树呢?那是因为红黑树是平衡二叉树,其插入和删除的效率都是logn,与AVL树相比,...原创 2019-11-03 14:25:50 · 1019 阅读 · 0 评论 -
重载、覆盖(重写)、隐藏
重写、重载、隐藏、重写与重载的区别原创 2019-11-03 13:13:33 · 200 阅读 · 0 评论 -
内存泄漏、内存溢出、段错误、堆溢出、栈溢出
内存泄漏内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理意义上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的分类:(1)堆内存泄漏(heap leak):堆内存指的是程序在运行中根据通过malloc/new等从堆中分配的一块内存,使用完成后必须通过调用相对应...原创 2019-10-22 13:58:29 · 3241 阅读 · 1 评论 -
Top K问题
Top K问题即在海量数据中取得最大的前K个。思考方法如下:(1)直接全部排序:此方法适用于内存够的情况。当数据量较小的情况下,内存中可以容纳所有数据,则最简单也最容易想到的方法就是将数据全部排序,然后取排序后的数据中的前K个。(2)快速排序的变形:首先选择一个划分元素,将比这个划分元素大的元素放到它的前面,比划分元素小的元素放到它的后面,此时便完成了一趟排序。如果此时的这个划分元素的下标...原创 2019-10-23 13:35:42 · 176 阅读 · 0 评论 -
栈和堆的区别
区别:(1)堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。(2)堆中的内存需要程序员手动申请和释放,栈中内存是由操作系统自动申请和自动释放的,存放着参数、局部变量等内容。(3)堆中频繁调用malloc和free会产生内存碎片,降低程序效率,而栈由于其先进后出的特性,不会产生内存碎片。(4)堆的分配效率较低,栈的分配效率较高。(5)程序的局部变量使用的是栈空间,new/ma...原创 2019-10-22 19:04:23 · 197 阅读 · 0 评论 -
malloc的原理
malloc的原理?brk系统调用的作用?mmap系统调用的作用?malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。当用户申请内存时直接从堆区分配一块合适的空闲块。malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显...原创 2019-10-22 18:44:40 · 1266 阅读 · 0 评论 -
const、extern、volatile关键字的作用
1.const关键字const是constant的缩写形式,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改,即只读变量。通常来说,const修饰一个变量时,一定要给这个变量初始化,若不初始化,后面就无法对其初始化。const离谁进,谁就不能被修改,如果const在最前面,则将其后移一位也是等效的。const的作用:(1)为代码阅读者传达有用信息。声明一...原创 2019-10-22 13:28:01 · 829 阅读 · 0 评论 -
C++源文件编译过程
对于C++源文件,从文本到可执行文件一般需要四个过程:预处理阶段→编译阶段→汇编阶段→链接阶段。预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,主要是处理源代码文件中以"#"开头的预编译指令,生成预编译文件。规则如下:(1)删除所有的#define,展开所有的宏定义。(2)处理所有的条件预编译指令,如"#if"、"#endif"、"#ifdef"、...原创 2019-10-22 12:35:15 · 1716 阅读 · 1 评论 -
C++的内存管理
在C++中,虚拟内存分为代码段、数据段、BSS段、堆区、文件映射区以及栈区六部分。其中,代码段、数据段、BSS段为静态存储区,堆区、映射区、栈区为动态存储区。代码段:包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。数据段:存储程序中已初始化的全局变量和静态变量。BSS段:存储未初始化的全局变量和静态变量,以及所有被初始化为0的全局变量和静态变量。对于未初...原创 2019-08-17 12:33:08 · 200 阅读 · 0 评论 -
函数指针
首先,函数指针就是指向函数的指针变量。函数指针本身首先是一个指针变量,该指针变量指向一个具体的函数。这正如用指针变量可只想整型变量、字符型、数组一样,这里是指向函数。C在编译时每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针常用于调用函数和做函数的...原创 2019-09-27 10:40:43 · 88 阅读 · 0 评论 -
智能指针
C++里面的四个智能指针分别是:auto_ptr,shared_ptr,weak_ptr,unique_ptr,其中后三个是C++11支持的,第一个auto_ptr已经被弃用。为什么要使用智能指针?智能指针的作用是管理一个指针,因为存在着以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析...原创 2019-09-25 18:46:23 · 230 阅读 · 0 评论 -
递归求斐波那契数列
斐波那契数列 题目描述:编写一个函数,求斐波那契数列的第n项的值。 首先,对于斐波那契数列,我们是非常熟悉了,对斐波那契定义为如下:f(0)=0,f(1)=0,f(2)=1,……f(n)=f(n-1)+f(n-2),其中n>1。对于这种求斐波那契数列第n项的问题,我们大多采用递归来解决。那什么是递归呢?递归即是在一个函数的内部调用这个函数自身的一种方法...原创 2019-07-30 21:27:21 · 20201 阅读 · 0 评论 -
static关键字的作用
全局静态变量 在全局变量之前加上static关键字,全局变量就被定义为一个全局静态变量。全局静态变量存放在静态存储区,在整个程序运行期间一直存在。未经初始化的全局静态变量会被自动初始化为0。 全局静态变量的作用域准确的来说是从定义之处开始,到文件结尾结束,在声明它的文件之外是不可见的。局部静态变量 在局部变量之前加上static关键字,局部...原创 2019-08-09 10:16:42 · 123 阅读 · 0 评论 -
new和malloc、delete和free的区别
区别1.new分配内存时按照数据类型进行分配,malloc分配内存时是按照指定大小分配2.new返回的是指定对象的指针,malloc返回的是void*型,因此malloc的返回值一般都需要进行类型转化3.new不仅分配一段内存,而且还会调用构造函数,malloc只分配内存,不调构造函数4.new分配的内存要用delete销毁,malloc要用free来销毁5.new是一个操作符...原创 2019-08-16 22:55:58 · 476 阅读 · 0 评论 -
C++四种cast及其使用
C++四种cast及其使用static_cast static_cast <T> content:静态转换,在编译期间处理 主要用于C++中内置的基本数据类型之间的转换,但是没有运行时类型的检测来保证转换的安全性。还用于各种隐式转换,比如非const转const,void*转指针等。1.用于基类和子类之间的指针或引用的转换。把子类的指针或引用转换为基类表示时(向...原创 2019-08-17 10:03:31 · 1595 阅读 · 0 评论 -
strcpy()、memcpy()、strlen()、memmove()
1.strcpy为字符串拷贝,而memcpy为内存拷贝2.拷贝内容不同。strcpy只用于字符串的拷贝,同时它还会拷贝字符串的结束符,而memcpy对于拷贝的内容没有限制,用途更广3.拷贝方法不同。strcpy不需要指定长度,遇到被拷贝字符串的结束符“\0”就停止拷贝,而memcpy则可以设置第三个参数来指定拷贝长度4.用途不同。通常拷贝字符串时使用strcpy,而不用memcpy,尽...原创 2019-08-17 11:05:10 · 176 阅读 · 0 评论 -
指针和引用、指针和数组以及数组和链表
指针和引用指针是一个变量,该变量专门存放内存地址。指针的类型取决于其指向的数据类型,指针的特点是它可以访问所指向的内存。指针利用地址,它的值直接指向存在电脑存储器中的另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的内存单元。引用其实就是某一变量的一个别名,对引用的操作与对变量直接操作完全一样。...原创 2019-08-17 11:36:12 · 225 阅读 · 0 评论 -
C++类的六个默认成员函数
1.构造函数:一个特殊的成员函数,名字与类名相同,创建类类型对象的时候由编译器自动调用,在对象的生命周期内只调用一次,以保证每个数据成员都有一个合适的初始值。构造函数不能为虚函数。必须在构造函数的初始化列表中进行初始化的数据成员有:(1)常量成员:因为常量只能初始化不能赋值,所以需要在初始化列表里边初始化。(2)引用类型:引用必须在定义的时候初始化,并且不能重新赋值,所以也要在初始化列...原创 2019-09-08 12:08:08 · 316 阅读 · 0 评论 -
类的继承与派生
所谓继承就是从先辈处得到属性和行为特征。类的继承,是新的类从已有类那里得到已有的特征。从已有类产生新类的过程就是类的派生。类的继承与派生机制允许程序员在保持原有类特性的基础上,进行更具体、更详细的修改和扩充。由原有类产生新类时,新类便包含了原有类的特征,同时也可以加入自己所特有的新特征。原有的类称为基类或父类,产生的新类称为派生类或子类。 如果一个派生类同时有多个...原创 2019-08-09 18:56:45 · 831 阅读 · 0 评论 -
STL之顺序容器
容器(container)是容纳、包含一组元素的对象。容器类库中包括7种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。这7种容器可以划分为两种基本类型:顺序容器(sequence container)和关联容器(associative container)。顺序容...原创 2019-09-21 18:50:53 · 916 阅读 · 0 评论 -
STL简介
STL,即标准模板库(Standard Template Library)。STL提供了一些常用的数据结构和算法。例如vector就是STL提供的一个容器,排序、顺序查找、折半查找算法等算法在STL中都有现成的函数模板。然而,这并不是STL的全部。STL更大的意义在于它定义了一套概念体系,为泛型程序设计提供了逻辑基础。下面通过程序来简单了解STL://从标准输入读入几个整...原创 2019-09-22 21:54:24 · 355 阅读 · 0 评论 -
STL之关联容器
以前说到的顺序容器,其元素顺序都是由程序员决定的,程序员可以随意指定新元素插入的位置。而对于关联容器而言,它的每一个元素都有一个键值(key),容器中元素的顺序并不能由程序员随意指定,而是按照键值的取值升序排列的。也就是说,对于一个关联容器s,使用迭代器在[s.begin(),s.end())区间内遍历,访问到的序列总是升序的,即s.begin()所指向的元素总是最小的,s.end...原创 2019-09-24 13:13:44 · 340 阅读 · 0 评论 -
运算符重载的规则与限制
1.运算符的优先级不能被重载改变。然而,圆括号能够强制改变表达式中重载运算符的求值顺序。2.运算符的结合性不能被重载改变。如果一个运算符的结合性是从左向右,那么,它的所有重载的版本的结合性依然是从左向右。3.运算符的目数(又称“元数”,即运算符所需要的操作数的数目)不能被重载改变。重载的一元运算符仍然是一元运算符;重载的二元运算符仍然是二元运算符。运算符“&”、“*”、“+”和“-...原创 2019-05-17 17:43:18 · 5261 阅读 · 0 评论