
C++
文章平均质量分 86
C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。
Jacky_Feng
这个作者很懒,什么都没留下…
展开
-
【数据结构】二叉搜索树(二叉排序树)、平衡二叉树、红黑树、B树、B+树详解
摘要:本文主要是对常用的树结构进行详解,其中包括二叉搜索树(二叉排序树)、平衡二叉树、红黑树、B树、B+树。原创 2024-08-20 20:56:18 · 427 阅读 · 0 评论 -
【数据结构】二叉树的基本形态和存储结构
摘要:本文主要介绍二叉树的基本结构和性质,并实现了二叉树的顺序存储和链式存储。原创 2020-09-06 22:16:27 · 9135 阅读 · 0 评论 -
【数据结构】哈希表
本文主要介绍了哈希表数据结构以及哈希冲突的解决方案,另外介绍了常用的哈希算法。原创 2024-08-19 22:08:00 · 1056 阅读 · 0 评论 -
【数据结构】归并排序
本文主要介绍了归并排序算法,算法思想、代码实现、算法特性这几方面进行讲解。原创 2024-08-18 18:20:33 · 500 阅读 · 0 评论 -
【数据结构】堆排序
本文介绍了堆排序算法,主要从算法思想流程、代码实现、算法特性进行分析讲解。原创 2024-08-18 15:33:37 · 457 阅读 · 0 评论 -
【数据结构】堆
本文主要介绍了堆的基本概念、堆的代码实现、堆的常见应用。原创 2024-08-18 10:50:08 · 765 阅读 · 0 评论 -
文件I/O基础
本文主要介绍了文件读写IO的过程和零拷贝技术,针对不同大小的文件应该选用什么方法才能高效地实现数据传输。原创 2024-07-24 21:11:04 · 734 阅读 · 0 评论 -
【数据结构】平衡二叉树
本文主要介绍了平衡二叉树的基本概念及基础操作(查找、平衡、插入、删除)。原创 2024-01-04 00:37:33 · 5865 阅读 · 0 评论 -
【数据结构】二叉搜索(查找/排序)树
本文主要介绍了二叉搜索树的基本概念和操作(查找、插入、删除)原创 2024-01-02 13:27:50 · 1648 阅读 · 0 评论 -
【Cmake】Cmake基础学习
本文主要介绍项目编译工具cmake的基本用法原创 2023-11-27 17:24:35 · 1049 阅读 · 0 评论 -
【数据结构】排序算法系列
本文主要介绍常见排序算法,并提供了相关算法的详细讲解链接。原创 2023-08-04 16:41:41 · 1306 阅读 · 0 评论 -
【数据结构】队列
摘要:本文主要介绍了队列数据结构,包括队列数据结构的简介和性质,及相关代码实现。原创 2024-08-20 21:14:39 · 450 阅读 · 0 评论 -
【C++】PIMPL模式
一、PIMPL模式引入PIMPL是指pointer to implementation,又称作“编译防火墙”。它通过将类B放置在单独的类A中,使用B的不透明指针进行访问实现,从而隐藏了A类的实现细节。是实现“将文件间的编译依存关系降至最低”的方法之一。实例:常规实现book类book.h#pragma once#include <iostream>class book{public: book(std::string name,double price); ~原创 2022-01-05 18:22:19 · 5701 阅读 · 1 评论 -
【C++】类默认函数的控制:=default 和 =delete
一、默认函数和已删除函数的引入C++的类中有四种特殊成员函数:默认构造函数、析构函数、拷贝构造函数及拷贝赋值运算符。C++11 引入了移动语义,并将移动构造函数和移动赋值运算符添加到编译器可自动生成的特殊成员函数的列表中。这对于简单类型非常方便,但是复杂类型通常自己定义一个或多个特殊成员函数,这可以阻止自动生成其他特殊成员函数。 具体规则: 如果显式声明了任何构造函数,则不会自动生成默认构造函数。 如果显式声明了虚拟析构函数,则不会自动生成默认析构函数。 如果显式声明原创 2021-10-22 13:26:31 · 1196 阅读 · 0 评论 -
【C++】Lamda表达式、仿函数(函数对象)
Lambda表达式的引入有的函数对象类只用来定义一个对象,而且这个对象只使用了一次,这样的函数对象类有点浪费。而且,定义函数对象类的地方和使用函数对象类可能相隔较远,想要查看其operator()成员函数到底做了什么会比较麻烦。对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?Lambda表达式就能解决这个问题,使用Lambda表达式可以定义并创建匿名的函数对象,减少程序中函数对象类的数量,以简化编程工作。Lambda的语法格式如下:【捕获列表】捕获上下文的变量以供Lamb.原创 2021-10-21 18:35:59 · 768 阅读 · 0 评论 -
【C++】引用
一、引用的概念参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、对象是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行频繁的内存拷贝可能会消耗很多时间,拖慢程序的执行效率。C/C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针。而对于结构体和对象没有这种限制,原创 2021-10-20 17:02:40 · 265 阅读 · 0 评论 -
【C++】动态对象创建
在C语言中提供了内存分配函数malloc()(或calloc()/realloc())和free(),这些函数在运行时从堆内存中分配存储单元。然而,在C++中这些函数将不能很好地运行。因为构造函数不允许我们向它传递内存地址来进行初始化。C++是如何保证正确的初始化和清理,又允许我们在堆上动态创建对象呢?malloc()和free()都是库函数,因此不在编译器控制范围为内。然而,如果有一个完成动态内存分配及初始化组合动作的运算符和另一个完成清理及释放内存组合动作的运算符,编译器就可以保证所有对象的原创 2021-10-20 11:35:22 · 6009 阅读 · 0 评论 -
【C++】虚函数及其内存布局
一、函数调用捆绑把函数体与函数调用相联系称为捆绑。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。C编译只有一种函数调用方式,就是早捆绑。早捆绑引起的问题:因为编译器在只有对象的地址时它并不知道要调用的正确函数。根据对象的类型,捆绑发生在运行时,这种捆绑方式称为晚捆绑,又称动态捆绑。二、虚函数对于特定的函数,为了引起晚捆绑,C++要求在基类中声明这个函数时使用virtual关键字,这样的函数称为虚函数。晚捆绑只对virtual函数起作用,而且只在使用含有virtual函.原创 2021-10-18 17:06:10 · 2192 阅读 · 0 评论 -
【C++】内联函数inline
引入内联函数的原因一个 C++程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生命,从而结束整个程序。函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行原创 2021-10-13 17:39:40 · 656 阅读 · 0 评论 -
【C++】移动构造函数
在 C++ 11 标准之前,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数。拷贝构造函数的实现原理是为新对象复制一份和其它对象一模一样的数据。而当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝的方式复制该指针成员。#include <iostream>using namespace std;class demo{public: demo():num(new int(0)){ cout<<"construct!"<原创 2021-10-13 16:47:49 · 7956 阅读 · 6 评论 -
【C++】左值和右值、左值引用(&)和右值引用(&&)
本文主要介绍了左值和右值的区别,右值引用的引入和使用。原创 2021-10-13 16:20:16 · 19404 阅读 · 8 评论 -
【C语言】源代码的编译过程
探索一下从C源代码到二进制可执行文件生成中间各个过程具体做了哪些工作。原创 2019-09-13 22:25:16 · 8032 阅读 · 0 评论 -
【C++】智能指针
内存管理是C++中的一个常见的错误和bug来源。在大部分情形中,这些bug来自动态分配内存和指针的使用:当多次释放动态分配的内存时,可能会导致内存损坏或者致命的运行时错误;当忘记释放动态分配的内存时,会导致内存泄露。所以,我们需要智能指针来帮助我们管理动态分配的内存。原创 2021-04-08 15:51:41 · 479 阅读 · 0 评论 -
【C++】STL 序列式容器源码剖析
一、vectorvector 基本能够支持任何类型的对象,同时它也是一个可以动态增长(二倍)的数组,使用起来非常的方便。【问题】它是如何做到动态扩容的呢?1、vector 基本数据结构基本上,STL 里面所有的容器的源码都包含至少三个部分: 迭代器,遍历容器的元素,控制容器空间的边界和元素的移动; 构造函数,满足容器的多种初始化; 属性的获取,比如 begin(),end()等; vector 也不例外,其实看了源码之后就发现,vector 相反是所有容器.原创 2021-04-05 15:48:06 · 1093 阅读 · 0 评论 -
【C++】STL相关容器的对比
目录一、序列容器(vector、list、deque)1、vector(向量容器)2、list(链表容器)3、deque(双端队列容器)二、关联容器(set、multiset、map、 multimap)1、set(集合)/multiset(多重集合)2、map(映射)/multimap(多重映射)3、unordered_set(无序集合)/unordered_multiset (无序多重集合) unordered_map( 无序映射)/unordered_...原创 2021-03-19 23:43:16 · 941 阅读 · 0 评论 -
【C++】C++三大特性——封装、继承、多态
一、封装利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。1、封装的意义:封装的意义在于保护或者防止代码(数据)被我们无意中破坏。 保护成员属性,不让类以外的程序直接访问和修改; 隐藏方法细节,使代码原创 2021-03-22 14:52:30 · 1490 阅读 · 0 评论 -
【C++】string类
C++大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。原创 2021-03-16 00:38:04 · 6310 阅读 · 0 评论 -
【C++】继承(基础概念、隐藏、派生类默认成员函数、与友元和静态成员的关系)
一、继承的概念1、继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加功能,这样产生的新类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。class Person{public: void Print() { cout << "name:" << _name << endl; cout &原创 2020-11-11 23:28:57 · 633 阅读 · 0 评论 -
【C++】友元函数和友元类(作用及优缺点)
目录一、友元函数二、友元类三、友元的优缺点一、友元函数结合着类的特性,可知:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需原创 2020-11-06 16:22:15 · 17182 阅读 · 5 评论 -
【C++】构造函数的初始化列表、explicit关键字、static(静态)成员
一、构造函数学习1.初始化列表初始化列表:是以冒号开始,后面接一个以逗号隔开的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。class Date{public: Date(int year, int month, int day): _year(year), _month(month), _day(day) {}private: int _year; int _month; int _day;};...原创 2020-11-05 23:06:34 · 725 阅读 · 0 评论 -
【C++】Date(日期)类
目录一、实现日期Date类。二、代码演示1、Date.h文件2、Date.cpp文件一、实现日期Date类。1、实现Date类的带参构造函数、拷贝构造函数、拷贝赋值函数2、实现Date类的+、-、++、--、==、>=等运算符的重载二、代码演示1、Date.h文件实现类的成员变量定义和成员函数声明。#pragma once#include <iostream>using namespace std;class Date{public原创 2020-11-03 16:39:42 · 3230 阅读 · 0 评论 -
【C++】类的六个默认成员函数及const函数
目录一、类的6个默认成员函数二、构造函数1、定义2、特性三、析构函数1、定义2、特性四、拷贝构造函数1、定义2、特征五、赋值运算符的重载1、运算符重载2、赋值运算符重载六、const成员函数1、定义2、辨析3、取址运算符重载和const取址运算符重载一、类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?实际并非如此,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。二、构造函数原创 2020-11-01 23:56:33 · 580 阅读 · 0 评论 -
【C++】类与对象及this指针
目录一、类的引入1、类的引入二、类的定义三、类的访问限定符四、类的作用域五、类的实例化六、类对象的大小(占据的字节数)及存储方式1、如何计算类对象的大小2、类对象的存储方式七、this指针1、this指针的引用2、this指针的特性一、类的引入1、类的引入C语言是面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是面向对象的编程语言,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。C语言和.原创 2020-10-31 19:56:54 · 443 阅读 · 0 评论 -
【C++】C++标准库之iomanip库(格式输入输出)
目录一、功能介绍二、相关函数介绍三、实例演示一、功能介绍用来对输入输出操作的格式进行更加方便的控制,在ios_base基类的基础上将每一种格式的设置和删除都进行了函数级的同名封装,提供了全局的调用接口函数,支持在运算符“<<”和“>>”上的多次使用,配合ios_base实例的控制。是I/O流控制头文件,就像C里面的格式化输出一样。如果在一次输出过程中需要混杂多种格式,使用ios_base的成员函数来处理就显得很不方便。STL另提供了iomanip库可以满足这种使原创 2020-10-16 17:56:30 · 13868 阅读 · 0 评论 -
【C++】STL之vector容器(定义及基本函数应用)
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。//创建一个向量存储容器 int//创建一个int型向量容器,最大容量20,初始值为0i < 10;i++) // push_back(elem)在数组最后添加数据//直接数组访问cout << "数组1:";i++)//size()容器中实际数据个数//迭代器访问。原创 2020-10-16 16:37:59 · 6687 阅读 · 0 评论 -
【C++】类构造函数(深拷贝与浅拷贝)
1.什么是类的构造函数类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时被自动调用。没创建一个对象都必须调用一次构造函数。构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回void。构造函数可用于为某些成员变量设置初始值。实例演示:#include<iostream>using namespace std;class Count...原创 2019-11-29 19:56:28 · 598 阅读 · 1 评论 -
【C++】static的用法详解
1.什么是static?static是c++常用的修饰符,它用来控制变量的存储方式和可见性。2.为什么要引入static函数内部定义的局部变量,在程序执行到定义点时,编译器为它在栈上分配空间,但此函数执行结束后空间会被释放回收。这样就会产生一个问题:如果想要将函数中的此变量的值保存至下一次调用时,如何实现?最容易想到的方法时定义一个全局变量,但定义一个全局变量有许多缺点,最明显的是破坏...原创 2019-11-26 18:47:26 · 1873 阅读 · 0 评论 -
【C++】inline内联函数
1.inline(内联函数)内联函数是指用inline关键字修饰的函数。如果内联函数在类体内定义,不用inline关键字声明,默认为内联函数。2.为什么引入内联函数使用函数能够避免将相同代码重写多次的麻烦,还可以减少可执行程序的体积,但也会带来程序运行时间上的开销。函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回...原创 2019-11-26 16:13:18 · 701 阅读 · 0 评论 -
【C++】指针和引用的区别及指针传递和引用传递的区别
一、指针和引用的区别:1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;引用和原来的变量实质上是同一个东西,只不过是原变量的一个别名。2.指针的值在初始化后可变,即指向其它的存储单元;引用只能在定义时被初始化一次,之后不可变3.指针有const,常指针不可变;引用没有const(具体指没有 int& const a这种形式,而有const int&am...原创 2019-11-26 01:17:31 · 4260 阅读 · 0 评论 -
【C++】内存栈和堆的区别
内存栈和堆的区别:管理方式:栈由编译器自动管理;堆由程序员控制,使用方便,但易产生内存泄漏 扩展方向:栈向低地址扩展,是连续的内存区域;堆是向高地址扩展,是不连续的内存区域。(原因:系统是用链表来存储空闲内存地址,是不连续的,而链表从低地址向高地址遍历) 空间大小:栈顶地址和栈的最大容量由系统预先规定(通常默认2M或10M);堆的大小受限于计算机系统中有效的虚拟内存,32位Linux系统中...原创 2019-11-25 21:57:59 · 408 阅读 · 0 评论