![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 77
~怎么回事啊~
这个作者很懒,什么都没留下…
展开
-
c++ template-1
函数模板定义了一组适用于不同类型的函数。当向模板函数传递变量时,函数模板会自行推断模板参数的类型,来决定去实例化出那种类型的函数。你也可以显式的指出模板参数的类型。你可以定义模板参数的默认值。这个默认值可以使用该模板参数前面的模板参数的类型,而且其后面的模板参数可以没有默认值。函数模板可以被重载。当定义新的函数模板来重载已有的函数模板时,必须要确保在任何调用情况下都只有一个模板是最匹配的。当你重载函数模板的时候,最好只是显式地指出了模板参数得了类型。原创 2024-02-21 10:01:01 · 934 阅读 · 0 评论 -
C++ template-2
在模板中,可以通过使用“转发引用”(亦称“万能引用”,声明方式为模板参数T加&&)和 std::forward<>将模板调用参完美地数转发出去。将完美转发用于成员函数模板时,在 copy 或者 move 对象的时候它们可能比预定义的特殊成员函数更匹配。可以通过使用 std::enable_if<>并在其条件为 false 的时候禁用模板。通过使用 std::enable_if<>,可以避免一些由于构造函数模板或者赋值构造函数模板比隐式产生的特殊构造函数更加匹配而带来的问题。原创 2024-02-21 10:00:27 · 628 阅读 · 0 评论 -
字符串编码
dsd原创 2023-08-28 18:06:45 · 200 阅读 · 0 评论 -
线程安全的shareptr 简单实现
【代码】线程安全的shareptr 简单实现。原创 2023-04-06 19:15:44 · 351 阅读 · 0 评论 -
SGI STL allocator
123原创 2022-10-09 21:21:19 · 696 阅读 · 0 评论 -
C++ lambda
123原创 2022-10-08 15:29:19 · 278 阅读 · 0 评论 -
C++ :空指针解引用
123原创 2022-10-08 10:48:30 · 1220 阅读 · 0 评论 -
std::unique_ptr作为形参时的使用问题
111原创 2022-07-12 16:40:19 · 2369 阅读 · 0 评论 -
基于可变参模板实现的线程池
123原创 2022-06-25 23:11:37 · 499 阅读 · 1 评论 -
C++工厂模式与在反射中的应用
C++工厂模式设计模式:可复用面向对象软件及基础:2-3 创建者模式:(Factory method)工厂方法_~怎么回事啊~的博客-CSDN博客C++ 反射反射的概念:指程序在运行时,访问、检测和修改它本身状态或行为的一种能力。简单的来说,就是一种自描述和自控制的能力。如果联想到镜子,就可以很好的理解,你能通过镜子看到自己,包括自己的动作,自己的外表。唯一不同的地方是,计算机语言的反射能力还包含对看到的自己采取措施。反射的作用在计算机编...原创 2022-04-10 16:18:15 · 1828 阅读 · 2 评论 -
奇异递归模板模式(Curiously Recurring Template Pattern)与在单例模式中的使用
奇异递归模板模式 奇异递归模板模式(Curiously Recurring Template Pattern,CRTP),CRTP是C++模板编程时的一种惯用法(idiom):把派生类作为基类的模板参数。更一般地被称作F-bound polymorphism。1980年代作为F-bound polymorphism被提出。Jim Coplien于1995年称之为CRTP。CRTP在C++中主要有两种用途:静态多态(static polymorphism) 添加方法同时精简代码...原创 2022-03-28 14:19:52 · 1184 阅读 · 0 评论 -
c++ emplace_back
C++11中大部分的容器对于添加元素除了传统的insert或者 pusb_back/push_front之外都提供一个新的函数叫做 emplace。 比如如果你想要向std::vector的末尾添加一个数据,你可以:std::vector<int> nums;nums.push_back(1);你也可以使用:std::vector<int> nums;nums.empace_back(1);那么这两种方式的区别到底是什么呢?避免不必要的临时对...原创 2021-12-18 18:12:37 · 2856 阅读 · 0 评论 -
C++ make_shared
在使用std::shared_ptr时,有两种不同的构造方式,如:#include <iostream>#include <memory>int main(){ std::shared_ptr<int> sp1(new int(10)); std::shared_ptr<int> sp2 = std::make_shared<int>(10); return 0;} C++11 中引入...原创 2021-12-05 22:01:41 · 2797 阅读 · 0 评论 -
C++中的RAII机制
什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。为什么要使用RAII?上面说到RAII是用来管理资源、避免资源泄漏...原创 2021-12-04 22:46:56 · 601 阅读 · 0 评论 -
设计模式:观察者模式(Observer)
观察者模式简介观察者模式又叫做观察者(Observer)监听者(Listener)模式,也叫发布(Publish)订阅(Subscribe)模式,常用于解耦事件的观察和事件最终的处理方式,举个例子说明:例子:基于同一组数据,生成了很多不同的界面来显示,有曲线图显示方式,有圆饼图显示方式,有柱状图显示方式等等…,当底层数据发生改变时,所有基于同一组数据的图像显示都需要修改图像,那么此时有两种实现方式:1、所有图形界面模块都去观察底层数据是否做了改变,如果变化,那么...原创 2021-12-04 22:28:17 · 1077 阅读 · 0 评论 -
设计模式:单例模式
单例模式指的是,无论怎么获取,永远只能得到该类类型的唯一一个实例对象,那么设计一个单例就必须要满足下面三个条件:1.构造函数私有化,这样用户就不能任意定义该类型的对象了2.定义该类型唯一的对象3.通过一个static静态成员方法返回唯一的对象实例饿汉模式饿汉式单例模式,顾名思义,就是程序启动时就实例化了该对象,并没有推迟到第一次使用该对象时再进行实例化;如果运行过程中没有使用到,该实例对象就被浪费掉了。#include<iostream>using namesp..原创 2021-12-04 21:49:31 · 323 阅读 · 0 评论 -
C++11 - thread多线程编程
1 线程创建与结束C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。<atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。 <thread>:该头文件主要声明了 std:原创 2021-12-04 18:50:36 · 3869 阅读 · 3 评论 -
C++ bind和function
bind1st 和bind2ndbind1st : operator()的第一个形参变量绑定成一个确定的值bind2nd : operator()的第二个形参变量绑定成一个确定的值实例:将数组从大到小排序后,按顺序插入70#include <iostream>#include <vector> #include <functional>#include <algorithm>#include <ctime>usin原创 2021-11-28 16:58:26 · 266 阅读 · 0 评论 -
深度探索C++对象模型第2章 构造函数语义学
1.究竟是不是每个类都有构造函数按照C++标准规定,每个类都有显式的或者隐式的构造函数和拷贝构造函数,但是编译器会区分这个类中的构造函数和拷贝构造函数是有用或者无用的,如果判定为有用,编译器就会将这个构造函数生成代码,如果没用,就不会生成代码。(简单来说就是C++规定了每个类都有构造和拷贝构造函数,但是编译器不一定为每个类生成构造或拷贝构造函数,下面的内容都是指编译以后是否是否具有构造函数,所以也有可能没有)如果类中已经自定义了构造函数,但是如果编译器判定为有用的构造函数代码仍然会自动加在自定义的构造原创 2021-11-21 22:15:30 · 641 阅读 · 0 评论 -
C++ 智能指针
unique_ptr只让1个智能指针管理资源,不会让多个智能指针管理同一个资源。部分源码:template<class _Ty, class _Dx> // = default_delete<_Ty> class unique_ptr : public _Unique_ptr_base<_Ty, _Dx> { // non-copyable pointer to an objectpublic: typedef _Unique_ptr_base&原创 2021-11-21 18:35:54 · 732 阅读 · 0 评论 -
C++ move和forward
在这两篇文件的基础之上;CSDNCSDNvector右值引用的push_back方法引用重叠:左值引用+右值引用=左值引用右值引用+右值引用=右值引用原创 2021-11-21 15:47:38 · 906 阅读 · 0 评论 -
C++ 对象使用过程中调用了哪些方法
示例1#include <iostream>using namespace std;class Test{public: Test(int a = 10) :ma(a) { cout << "Test(int)" << endl; } ~Test() { cout << "~Test()" << endl; } Test(const Test &t) :ma(t.ma) {原创 2021-11-20 20:36:04 · 346 阅读 · 0 评论 -
c++函数对象与lambda表达式实现原理
函数对象函数对象:拥有()operator重载函数的对象即函数对象,函数对象类似C语言里面的函数指针,但在C++里为函数对象。什么是函数对象例如:我们C语言进行函数调用与C++中两个函数调用。看起来它们好像一模一样,但是C语言中的sum(),是函数名为一个地址;但C++中的sum()为一个对象,sum调用自己的()重载函数将10与20传给sum调用的()运算符重载函数了,它接受两个实参,再执行a+b。 即:sum.operator()(10,20)使用函数对象好...原创 2021-11-20 17:45:29 · 948 阅读 · 0 评论 -
C++ vector 迭代器失效问题
问题:(1)删除vector中所有的偶数#include <iostream>#include <vector>using namespace std;int main(){ vector<int> vec; for (int i = 0; i < 10; ++i) { vec.push_back(i); } //把vec容器中的所有偶数删除 auto it = vec.begin(); for (; it原创 2021-11-14 18:40:33 · 2581 阅读 · 1 评论 -
C++ 实现string
C++ stl string的功能#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>using namespace std;int main(){ //默认构造函数 string str1; string str2 = "aaa"; string str3 = "bbb"; //+ 运算符重载 string str4 = str2 + str3; st原创 2021-11-14 13:12:31 · 866 阅读 · 0 评论 -
C++模板及实现vector
函数模板函数模板:是不进行编译的,因为类型还不知道模板的实例化:函数调用点进行实例化模板函数:才是要被编译器所编译的模板类型参数:typyname/class模板非类型参数:模板非类型形参的详细阐述_Jerish的博客-CSDN博客模板的实参推演:可以根据用户传入的实参的类型,来推导出模板类型参数的具体模板的特例化(专用化)的实例化模板函数、模板的特例化和非模板函数的重载关系:候选的函数中,优先在精确匹配中选择,优先选择普通函数,特例性更强的模版函数次之,然后是模版函数的特化原创 2021-11-13 23:46:43 · 2074 阅读 · 0 评论 -
C++类和this指针
1 面向对象语言的四大特征:抽象,封装(public,private,protected),继承,多态2 类可以实例无数的对象,每个对象都有自己的成员变量,但是共享一套成员方法代码(存储在.text) 类的成员方法一经编译,所有的方法都有加一个this指针,接收调用该方法的对象的地址深拷贝与浅拷贝在类对象的拷贝中,使用memcpy realloc 防止产生浅拷贝实现String类的默认构造函数 拷贝构造函数 赋值运算符#define _CRT_SECURE_NO_W...原创 2021-11-13 15:56:25 · 640 阅读 · 0 评论 -
C++ 深入理解C++的new 和delete
new和malloc的区别(1)new delete ,称为运算符;delete和free称作C的库函数(2)new 不仅可以做内存开辟,还可以做内存初始化操作;malloc仅开辟内存;(3)malloc开辟内存失败,是通过返回值和nullptr做比较;而new 开启内存失败,是通过抛bad_alloc类型的异常来判断的#include <iostream>#include <typeinfo.h>int main(){ int *p = (int *)m原创 2021-11-07 21:59:09 · 732 阅读 · 0 评论 -
C++ const、指针和引用(左值引用和右值引用),std::move std::forward
const什么是const? const修饰的变量不能够再作为左值,初始化完成后,值不能被修改。C与C++中const的区别是什么? c语言中,const修饰的值,可以不用初始化,不叫常量,叫做常变量;输出30 30 30 C++中:const 定义的类型必须初始化,否则报错,c语言中可以不初始化#include <iostream>int main(){ const int a = 10 ; i...原创 2021-11-07 21:35:50 · 1046 阅读 · 0 评论 -
C++ 详解函数重载
函数重载:一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称作函数重载。函数重载发生在编译时期。 (1)函数重载与函数返回值无关,因为在产生符号时没有返回值 (2) 函数重载需要在同一个作用域 (3)const或者volatile的时候,是如何影响形参的1 为什么C++支持函数重载,C语言不支持编译器产生函数符号的规则不同: C++代码产生函数符号时,函数名+参数列表组成;C语...原创 2021-11-07 11:48:43 · 517 阅读 · 0 评论 -
C++ 内联函数inline
1 内联函数与普通函数的区别?1 内联函数;在编译过程中,就没有函数调用开销。在函数的调用点直接将函数的代码进行展开处理从指令角度掌握函数调用堆栈详细过程_LIJIWEI0611的博客-CSDN博客中知道,在调用函数的过程中:(1)将函数实数从右向左压栈(2)call指令:将下一行要执行的代码地址入栈 跳转到函数入口:首先push ebp,将栈底指针入栈,然后给函数开辟栈帧 函数执行结束后,栈帧回退。在函数调用中,有大量的函数调用开销。如果封装的函数内容简单,函数...原创 2021-11-07 11:14:01 · 549 阅读 · 0 评论 -
C++形参带默认值的函数
在C++中,声明一个函数时,可以为函数的参数指定默认值。当调用有默认参数值的函数时,可以不写出参数,这时就相当于以默认值作为参数调用该函数。使用默认参数时的注意事项:① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一double sqrt(double f = 1.0); //函数声明double sqrt(double f) //函数定义{ // .... }② 没有函数(原型)时,默认参数在函数定义时指定...原创 2021-11-07 10:51:00 · 782 阅读 · 0 评论 -
从指令角度掌握函数调用堆栈详细过程
栈空间栈空间是从高地址向低地址扩充,堆地址是从低地址向高地址扩充。堆栈是一种具有一定规则的数据结构,我们可以按照一定的规则进行添加和删除数据。它使用的是后进先出的原则。在x86等汇编集合中堆栈与弹栈的操作指令分别为:PUSH:将目标内存推入栈顶。POP:从栈顶中移除目标。当执行一个函数的时候,相关的参数以及局部变量等等都会被记录在ESP、EBP中间的区域。一旦函数执行完毕,相关的栈帧就会从堆栈中弹出,然后从预先保存好的上下文中进行...原创 2021-11-06 23:51:32 · 2093 阅读 · 0 评论 -
深度探索C++对象模型第1章 关于对象
一、何为C++对象模型?C++对象模型可以概括为以下2部分:1. 语言中直接支持面向对象程序设计的部分2. 对于各种支持的底层实现机制语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等第一部分这里我简单过一下,重点在底层实现机制。在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数原创 2021-10-31 22:47:02 · 191 阅读 · 0 评论 -
C++内存布局
每个进程的用户空间是私有的,内核空间是共享的;通过进程间通信比线程间通信难也是因为进程间的用户空间是相互隔离的,无法相互访问,需要通过进程间通信方式通信,通过内核地址空间;#include <iostream>int gdata1 = 1;int gdata2 = 0;int gdata3;static int gdata4 = 4;static int gdata5 = 0;static int gdata6;int main() { int a..原创 2021-10-11 18:21:36 · 884 阅读 · 0 评论 -
C++代码编译链接原理
整个编译过程分为两大步:1).编译 :把文本形式的源代码翻译成机器语言,并形成目标文件2)连接 :把目标文件 操作系统的启动代码和库文件组织起来形成可执行程序1.编译细分为3个阶段:1.1)编译预处理预处理又称为预编译,是做些代码文本替换工作。编译器执行预处理指令(以#开头,例如#include),这个过程会得到不包含#指令的.i文件。这个过程会拷贝#include 包含的文件代码,进行#define 宏定义的替换 , 处理条件编译指令 (#ifndef #ifdef...原创 2021-10-11 18:21:17 · 987 阅读 · 0 评论 -
C++虚函数与静态、动态绑定
覆盖:如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数,它们之间成为覆盖关系;也就是说派生类会在自己虚函数表中将从基类继承来的虚函数进行替换,替换成派生类自己的。静态绑定:编译时期的多态,通过函数的重载以及模板来实现,也就是说调用函数的地址在编译时期我们就可以确定,在汇编代码层次,呈现的就是 call 函数名;动态绑定:运行时期的多态,通过派生类重...原创 2021-10-11 18:20:37 · 743 阅读 · 0 评论 -
dynamic_cast实现原理
在使用dynamic_cast时,查看的反汇编,假设C是派生类,A是基类A* pa = new C; C * c = dynamic_cast<C *>(pa);其中调用了___RTDynamicCast,在http://en.verysource.com/winceos-99192.html中有其中便有其实现,为了不和编译器中的___RTDynamicCast冲突,新建两个文件:rtti.h和rtti.cpp,将___RTDynamicCast修改为___...原创 2021-10-11 15:35:15 · 2546 阅读 · 0 评论 -
C++中的RTTI机制
https://www.jianshu.com/p/3b4a80adffa7https://www.cnblogs.com/chechen/p/11728743.html原创 2021-08-20 11:33:00 · 103 阅读 · 0 评论 -
C++虚函数表
https://www.cnblogs.com/yunlambert/p/9876564.html原创 2021-08-20 11:33:10 · 70 阅读 · 0 评论