![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
骆驼胡杨
这个作者很懒,什么都没留下…
展开
-
结构体的内存对齐
结构体的内存对齐Demo#include <stdio.h>#include <stdlib.h>using namespace std;struct A{ char c; int i;};struct B{ char c; int i; double d; };struct C{ char c; int i; double d; char c1;};int main(){原创 2022-03-13 09:13:46 · 105 阅读 · 0 评论 -
C++基础知识 - 智能指针的使用陷阱
1. 不要把一个原生指针给多个智能指针管理int *x = new int(10);unique_ptr<int> up1(x);unique_ptr<int> up2(x);//警告! 以上代码使up1 up2指向同一个内存,非常危险或以下形式:up1.reset(x);up2.reset(x); 2. 记得使用u.release()的返回值在调用u.release()时是不会释放u所指的内存的,这时返回值就是对这块内存的唯一索引,如果没有使用这个返原创 2022-03-12 21:32:25 · 1368 阅读 · 0 评论 -
C++基础知识 - shared_ptr 使用详解 (C++11)
shared_ptr 使用详解 (C++11)熟悉了unique_ptr 后,其实我们发现unique_ptr 这种排他型的内存管理并不能适应所有情况,有很大的局限!如果需要多个指针变量共享怎么办?如果有一种方式,可以记录引用特定内存对象的智能指针数量,当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它!这就是 shared_ptr 采用的策略!构造函数shared_ptr<T> sp ; //空的s原创 2022-03-12 21:30:42 · 905 阅读 · 0 评论 -
C++基础知识 - unique_ptr 使用详解 (C++11)
unique_ptr 使用详解 (C++11)C++11用更严谨的unique_ptr 取代了auto_ptr!unique_ptr特性基于排他所有权模式:两个指针不能指向同一个资源无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时 右值赋值构造和赋值保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。在容器中保存指针是安全的 //弊端1. auto_ptr 被C++11 抛弃的主要理由 p1= p2 ,复制或赋值都会改变资源的所有权原创 2022-03-11 22:53:16 · 2679 阅读 · 0 评论 -
C++基础知识 - auto_ptr智能指针 (C++98)
auto_ptr 使用详解 (C++98)auto_ptr 是c++ 98定义的智能指针模板,其定义了管理指针的对象,可以将new 获得(直接或间接)的地址赋给这种对象。当对象过期时,其析构函数将使用delete 来释放内存!用法:头文件: #include < memory>用 法: auto_ptr<类型> 变量名(new 类型)例 如:auto_ptr< string> str(new string("我要成为大牛~ 变得很牛原创 2022-03-11 16:26:32 · 885 阅读 · 0 评论 -
C++基础知识 - 智能指针
为什么要使用智能指针思考:如果我们分配的动态内存都交由有生命周期的对象来处理,那么在对象过期时,让它的析构函数删除指向的内存,这看似是一个 very nice 的方案?智能指针就是通过这个原理来解决指针自动释放的问题!C++98 提供了 auto_ptr 模板的解决方案C++11 增加unique_ptr、shared_ptr 和weak_ptr#include <iostream>#include <string>#include <exce原创 2022-03-11 14:03:24 · 158 阅读 · 0 评论 -
C++基础知识 - C++的类型转换
C++的类型转换旧式转型 C风格的强制类型: TYPE b = (TYPE) a 例如: int i = 48; char c = (char) i; //强制转换新式转型C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。格式: TYPE b = 类型操作符<TYPE> ( a ) 类型操作符= static_cast | reinterpreter_cast | dynamic_cast | const_cast原创 2022-03-11 10:22:43 · 713 阅读 · 0 评论 -
STL项目练习 - 实现一个通用的容器
STL项目练习实现一个通用的容器能够支持插入多种不同的普通类型(包含 int char float double 等)和自定义结构体和自定义类的对象并能根据每种不同类型的比较规则从容器中取得最大或最小的那个值或对象分 析通用的容器 - 自己开发 or 重用STL现有容器?支持插入多种类型 - 非模板莫属取最大最小值 - 函数对象(仿函数)? or set/multiset接口设计 - sizeFilter1. 构造函数2 .赋值运算符重载3. 大小原创 2022-03-09 22:38:48 · 258 阅读 · 0 评论 -
C++基础知识 - C++11新增容器 - array
array容器概念-array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。array是将元素置于一个固定数组中加以管理的容器。array可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作,也可以使用迭代器访问不支持动态的新增删除操作array可以完全替代C语言中的数组,使操作数组元素更加安全!#include < array>array特点array 容器的大小是固原创 2022-03-08 23:25:32 · 713 阅读 · 0 评论 -
C++基础知识 - 函数返回引用深度解析
函数返回引用深度解析C++引用使用时的难点:当函数返回值为引用时, 若返回局部变量,不能成为其它引用的初始值,不能作为左值使用返回静态变量 或 全局变量的引用, 可成为其他引用的初始值, 也可以作为左值, 也可作为右值返回函数的普通形参作为引用, 不能作为其他引用的初始值, 不能作为左值使用返回函数的引用形参作为引用, 可成为其他引用的初始值, 也可以作为左值, 也可作为右值#include <iostream>#include <stdlib.h>#includ原创 2022-03-08 21:20:27 · 2678 阅读 · 0 评论 -
C++基础知识 - 左值和右值
左值和右值的概念存储的层次结构左值和右值的概念按字面意思,通俗地说。以赋值符号 = 为界,= 左边的就是左值(lvalue),= 右边就是右值(rvalue)。 int a = 666; 左值 右值 int b = 888; 左值 右值 int c = a + b; 左值 右值 右值原创 2022-03-08 19:09:29 · 204 阅读 · 0 评论 -
C++基础知识 - explicit 关键字
explicit 关键字作用是表明该构造函数是显示的, 而非隐式的.不能进行隐式转换!跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).#include <iostream>#include <string>using namespace std;class student {public: //构造函数只能显示构造 explicit student(int _age) { age = _原创 2022-03-08 17:17:06 · 313 阅读 · 0 评论 -
C++基础知识 - stack容器
stack容器stack是堆栈容器,是一种“先进后出”的容器。stack是基于deque容器而实现的容器。#include < stack>stack对象的默认构造stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT; stack <int> stkInt; //一个存放int的stack容器。stack <float> stkFloat; //一个存放float的stack容器原创 2022-03-07 23:22:00 · 245 阅读 · 0 评论 -
C++基础知识 - 优先级队列priority_queue
优先级队列 priority_queue优先队列: 它的入队顺序没有变化,但是出队的顺序是根据优先级的高低来决定的。优先级高的优先出队。最大值优先级队列、最小值优先级队列用来开发一些特殊的应用#include < queue>priority_queue<int> pq1; //默认情况, 值越大, 出队优先级越高priority_queue<int, vector<int>, less<int>> pq1; //指原创 2022-03-07 22:43:30 · 279 阅读 · 0 评论 -
C++基础知识 - Queue容器
Queue简介queue是队列容器,是一种“先进先出”的容器。默认情况下queue是利用deque容器实现的一种容器。它只允许在队列的前端(front)进行删除操作,而在队列的后端(back)进行插入操作#include < queue>queue对象的默认构造queue采用模板类实现,queue对象的默认构造形式:queue<T> queT; 如:queue<int> queueInt; //一个存放int的queue容器。原创 2022-03-07 22:10:32 · 338 阅读 · 0 评论 -
C++基础知识 - map和multimap容器
map/multimap的简介map是标准的关联式容器,一个map里存储的元素是一个键值对序列,叫做(key,value)键值对。它提供基于key快速检索数据的能力。map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。map底层的具体实现是采用红黑树变体的平衡二叉树的数据结构。在插入操作、删除和检索操作上比vector快很多。map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。头文件 #include原创 2022-03-07 17:14:33 · 828 阅读 · 0 评论 -
C++基础知识 - Set和multiset容器
set/multiset容器概念set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从原创 2022-03-06 15:33:47 · 626 阅读 · 0 评论 -
C++基础知识 - 仿函数(函数对象)functor的用法
仿函数概念仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。functional头文件中包含的 greater< int>与less< int>就是原创 2022-03-05 21:51:22 · 909 阅读 · 0 评论 -
C++基础知识 - C++11新特性 变参模板、完美转发和emplace
C++11新特性 变参模板、完美转发和emplace变参模板 - 使得 emplace 可以接受任意参数,这样就可以适用于任意对象的构建完美转发 - 使得接收下来的参数 能够原样的传递给对象的构造函数,这带来另一个方便性#include <iostream>#include <list>#include <vector>#include <deque>#include <algorithm>using namespace std原创 2022-03-04 23:11:26 · 339 阅读 · 0 评论 -
C++基础知识 - List容器概述
List 容器概念list是一个双向链表容器,可高效地进行插入删除元素。List 特点:list不可以随机存取元素,所以不支持at.(position)函数与[]操作符。可以对其迭代器执行++,但是不能这样操作迭代器:it+3使用时包含 #include < list>可以对元素进行反转 list对象的默认构造list同样采用模板类实现,对象的默认构造形式:list<T> listT; 如:list<int> lstInt;原创 2022-03-04 20:09:14 · 317 阅读 · 0 评论 -
C++基础知识 - deque容器概述
deque容器概念deque是“double-ended queue”的缩写,和vector一样都是STL的容器,唯一不同的是: deque是双端数组,而vector是单端的。Deque 特点:deque在接口上和vector非常相似,在许多操作的地方可以直接替换。deque可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法)deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元素或移除元素比较费时。使用时,包含头文件:#include < deque&原创 2022-03-03 23:00:05 · 473 阅读 · 0 评论 -
C++基础知识 - vector容器概述
vector容器概vector是将元素置于一个动态数组中加以管理的容器。vector可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时...原创 2022-03-03 14:44:00 · 424 阅读 · 0 评论 -
C++基础知识 - 容器概述
容器概述在实际的开发过程中,数据结构本身的重要性完全不逊于算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。试想: 一条死胡同里面停车,这样的效率会很高吗?经典的数据结构数量有限,但是在项目实战中,我们常常重复着一些为了存放不同数据类型而实现顺序表、链表等结构而重复编写的代码,这些代码都十分相似,只是为了适应不同数据类型的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模原创 2022-03-02 21:38:51 · 144 阅读 · 0 评论 -
C++基础知识 - STL(标准模板库)
STL主要分为分为三类:algorithm(算法) - 对数据进行处理(解决问题) 步骤的有限集合container(容器) - 用来管理一组数据元素Iterator (迭代器) - 可遍历STL容器内全部或部分元素”的对象容器和算法通过迭代器可以进行无缝地连接。在STL中几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。STL 最早源于惠普实验室,早于C++存在,但是C++引入STL概念后,STL就成为C++的一原创 2022-03-02 20:37:02 · 82 阅读 · 0 评论 -
C++基础知识 - 标准程序库异常
标准程序库异常demo#include <iostream>#include <Windows.h>#include <exception> //分配动态内存异常#include <stdexcept> //数值范围异常#include <string>using namespace std;class Vector {public: Vector(int age) { if (age > 100) {原创 2022-03-01 23:28:53 · 312 阅读 · 0 评论 -
C++基础知识 - 继承与异常
继承与异常异常也是类,我们可以创建自己的异常类,在异常中可以使用(虚函数,派生,引用传递和数据成员等)案例:设计一个数组类容器 Vector,重载[]操作,数组初始化时,对数组的个数进行有效检查1)index<0 抛出异常errNegativeException2)index = 0 抛出异常 errZeroException3)index>1000抛出异常errTooBigException4)index<10 抛出异常errTooSmallException5)e原创 2022-03-01 22:45:29 · 421 阅读 · 0 评论 -
C++基础知识 - 异常类型和生命周期
1)throw基本类型(int, float, double, char)#include <iostream>#include <Windows.h>#include <string>using namespace std;//实现文件的二进制拷贝int copyfile2(const char* dest, const char* src) throw(int, string, float) { FILE* fp1 = NULL, * fp2 = N.原创 2022-03-01 21:09:47 · 425 阅读 · 0 评论 -
C++基础知识 - 异常处理机制
异常处理机制异常无处不在,程序随时可能误入歧途!C++ 提出了新的异常处理机制!异常是一种程序控制机制,与函数机制互补函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它可以在出现“意外”时中断当前函数,并以某种机制(类型匹配)回馈给隔代的调用者相关的信息.#include <stdio.h>#include <stdlib.h>#include <string>using namespace std;#defi原创 2022-03-01 14:54:41 · 418 阅读 · 0 评论 -
类模板中使用重载输出运算符<< VS2019编译器提示无法解析的外部命令
类模板中使用重载输出运算符<< VS2019编译器提示无法解析的外部命令 在模板类, 使用重载运算符的时候,编译器无法通过编译 后来问了群里大牛, 才知道是C++开发者挖的一个坑, 只要在代码里添加<>就完美解决 代码:#pragma once#include <iostream>using namespace std;//Vector容器类template <typename T>class Vec原创 2022-02-27 22:19:19 · 1052 阅读 · 1 评论 -
C++基础知识 - 类模板使用总结
类模板使用总结声明和使用类模板:先写出一个实际的类。将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的T)。在类声明前面加入一行,格式为: template <typename 虚拟类型参数> 如: template <typename numtype> class A { //类体… }; 用类模板定义对象时用以下形式:类模板名<实际类型名> 对象名;或 类模板名<原创 2022-02-26 22:11:23 · 239 阅读 · 0 评论 -
C++基础知识 - 类模板与静态数据成员
类模板与静态数据成员#include <iostream>#include <Windows.h>using namespace std;//类模板template <typename T>class Demo {public: Demo(T data = 0); T getData() const;public: //模板类静态成员函数 static T count;private: T data;};//静态数据成员初始化tem原创 2022-02-26 21:52:48 · 466 阅读 · 0 评论 -
C++基础知识 - 类模板与友元函数
类模板与友元函数Demo.h#pragma oncetemplate <typename T>class Demo{public: Demo(T data = 0); T getData() const; //友元函数声明 template <typename T> friend Demo<T>& AddDemo(const Demo<T>& demo1, const Demo<T>& demo2);原创 2022-02-26 21:20:00 · 132 阅读 · 0 评论 -
C++基础知识 - 类模板函数写在类的外部
1. 所有的类模板函数写在类的外部,在一个cpp中#include <iostream>#include <Windows.h>using namespace std;template <typename T>class Demo {public: Demo(T data = 0); //构造函数 Demo operator+(const Demo& other); //对象的data相加,返回一个对象 T getData() const; /原创 2022-02-26 17:09:45 · 1741 阅读 · 0 评论 -
C++基础知识 - 类模板和继承
继承中类模板的使用 1. 父类一般类,子类是模板类,和普通的用法类似#include <iostream>#include <Windows.h>using namespace std;//父类是一般类class Father {public: Father(int age) { this->age = age; } int getAge() const { return age; }private: int age;};templat原创 2022-02-26 14:33:19 · 1032 阅读 · 0 评论 -
C++基础知识 - 类模板
1.为什么需要类模板类模板与函数模板的定义和使用类似,有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,我们可以通过如下面语句声明了一个类模板:#include <iostream>#include <Windows.h>using namespace std;template <typename T>class Demo {public: Demo(T a) { this->a = a; } //构造函数的参数使用类模板 T getA原创 2022-02-26 10:13:11 · 381 阅读 · 0 评论 -
C++基础知识 - 函数模板和函数重载
函数模板和函数重载#include <iostream>#include <Windows.h>using namespace std;template <typename T>//交换两个数void Swap(T &a, T &b) { cout << "调用了函数模板" << endl; int tmp = a; a = b; b = tmp;}void Swap(char& a, int&原创 2022-02-25 22:09:39 · 358 阅读 · 0 评论 -
C++基础知识 - 函数模板的概念
数模板语法所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。所有函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。函数模板定义形式由以下三部分组成: 模板说明 + 函数定义 + 函数模板调用template < 类型形式参数表 >类型 函数名 (形式参数表) { &nb原创 2022-02-25 21:26:33 · 654 阅读 · 0 评论 -
C++基础知识 - 函数模板
函数模板C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。为什么要使用函数模板项目需求: 实现多个函数用来返回两个数的最大值,要求能支持char类型、int类型、double类型变量声明了一个函数模板, T 可以替代任何类型T - 参数化数据类型template < typename T &g原创 2022-02-25 18:51:42 · 167 阅读 · 0 评论 -
C++基础知识 - 纯虚函数与抽象类
什么时候使用纯虚函数某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数,只是为了提供一个形式上的接口,准备让子类来做具体的实现。此时,这个方法,就可以定义为“纯虚函数”, 包含纯虚函数的类,就称为抽象类。纯虚函数的使用方法用法:纯虚函数,使用virtual和 =0virtual float getArea() = 0;#include <iostream>#include <Windows.h>using name原创 2022-02-25 09:54:16 · 184 阅读 · 0 评论 -
C++基础知识 - 子类的析构函数
子类的析构函数【注意】为了防止内存泄露,最好是在基类析构函数上添加virtual关键字,使基类析构函数为虚函数目的在于,当使用delete释放基类指针时,会实现动态的析构:如果基类指针指向的是基类对象,那么只调用基类的析构函数如果基类指针指向的是子类对象,那么先调用子类的析构函数,再调用父类的析构函数#include <iostream>#include <Windows.h>using namespace std;class Father {public:原创 2022-02-24 21:27:51 · 1153 阅读 · 0 评论