C++
文章平均质量分 58
c++
bob62856
这个作者很懒,什么都没留下…
展开
-
C++中[&]含义
auto toNumber = [&](string const& s) -> unsigned { ...}[]:定义匿名函数[&]:以引用形式捕获所有外部变量,也就是外部变量均可用(string const &s) :匿名函数的参数->:定义匿名函数unsigned:函数返回值类型{...}:函数实现体原文链接:https://blog.csdn.net/huluwaaaa/article/details/103225311...转载 2022-02-09 14:09:38 · 7442 阅读 · 0 评论 -
C++ memcpy和memmove实现
memcopy和memmove函数在linux下看了一下两个函数的源码。两个函数都在头文件string.h中定义,函数原型为:void * __cdecl memcpy ( void * dst,const void * src,size_t count);void * __cdecl memmove ( void * dst,const void * src,size_t count);实现代码如下:void * __cdecl memcpy ( void * dst,const void *转载 2020-10-13 18:43:06 · 365 阅读 · 0 评论 -
C++中虚函数、虚指针和虚表详解
关于虚函数的背景知识用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。存在虚函数的类都有一个一维的虚函数表叫做虚表。每一个类的对象都有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。多态性是一个接口多种实现,是面向对象的核心。分为编译多态性和运行多态性。运行多态用虚函数来实现,结合动态绑定。纯虚函数是虚函数再加上=0。并且该函数只有声明,没有实现。抽象类是指包括至少一个纯虚函数的类。详细原理:编译器在编译的时候,发现Base类中有虚函数,此时编译器转载 2020-09-28 22:44:26 · 5484 阅读 · 0 评论 -
C++中的单例模式
一、什么是单例模式单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。定义一个单例类,私有化它的构造函数,以防止外界创建单例类的对象;使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。二、懒汉版(Lazy Singleton)教学版,即懒汉版(Lazy Singleton):单例实例在第一次被使用时才进行初始化,这叫做延迟初始化。// versio转载 2020-09-21 22:34:07 · 3459 阅读 · 0 评论 -
C++ 智能指针的正确使用方式
C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,同时也将 auto_ptr 置为废弃 (deprecated)。但是在实际的使用过程中,很多人都会有这样的问题:不知道三种智能指针的具体使用场景无脑只使用 shared_ptr认为应该禁用 raw pointer(裸指针,即 Widget *这种形式),全部使用智能指针本文将从这几方面讲解智能指针:智能指针的应用场景分析智能指针的性能分析: 为什么 shared_ptr 性能比 uniqu转载 2020-09-21 18:58:43 · 1713 阅读 · 0 评论 -
C++ 继承
访问控制和继承一个派生类继承了所有的基类方法,但下列情况除外:基类的构造函数、析构函数和拷贝构造函数。基类的重载运算符。基类的友元函数。继承类型当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:公有继承(public):转载 2020-09-18 19:27:53 · 149 阅读 · 0 评论 -
C++中五种迭代器
算法要求的迭代器操作分为五个类别:输入迭代器输入迭代器可用于读取容器中的元素,但是不保证能支持容器的写入操作。输入迭代器必须至少提供下列支持。相等和不等操作符(==,!=),比较两个迭代器。前置和后置的自增运算(++),使迭代器向前递进指向下一个元素。用于读取元素的解引用操作符(*),此操作符只能出现在赋值运算的右操作数上。箭头操作符(->),这是 (*it).member 的同义语,也就是说,对迭代器进行解引用来获取其所关联的对象的成员。输入迭代器只能顺序使用;一旦输入迭代器自增了,转载 2020-09-08 13:08:01 · 2238 阅读 · 0 评论 -
C中printf函数的实现原理
一、printf函数的实现原理在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。printf的第一转载 2020-09-02 17:03:11 · 8646 阅读 · 2 评论 -
C++中自定义比较函数和重载运算符总结
sort自定义比较函数//示例struct node{ int x, y;};bool cmp(const node& a, const node& b){ return a.x > b.x //对x降序排列}node d[maxn];int main(){ sort(d, d + n, cmp); return 0;}注:自定义比较函数的形式同样也适用于pair类型数据排序。重载运算符<//示例struct no转载 2020-08-30 01:52:15 · 5868 阅读 · 0 评论 -
C++中对象数组的构造函数和析构函数调用
C++的对象数组顾名思义,即是存储对象的数组。比如有一个对象A,实例化为对象数组有如下两种方式:A a[3]; //第一种方法,在栈空间中占用内存A *a = new A[3];//第二种方法,在堆空间中分配空间对象数组调用构造函数及析构函数例子1class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; }};int原创 2020-08-28 01:59:15 · 3362 阅读 · 0 评论 -
C++ 构造函数初始化列表
《C++ Primer》中提到在以下三种情况下需要使用构造函数初始化列表:需要初始化的类的成员变量是对象的情况;需要初始化的类的成员变量由const修饰的或初始化的类的引用成员变量;子类初始化父类的成员;情况1:类的成员变量是对象,并且这个对象只有含参数的构造函数,没有无参数的构造函数;如果我们有一个类的成员变量,它本身是一个类的对象,而且这个成员变量需要带参数的构造函数进行初始化,这时要对这个类的成员变量进行初始化,就必须调用这个类的成员变量的带参数的构造函数,如果没有初始化列表转载 2020-08-28 01:32:04 · 485 阅读 · 0 评论 -
C++构造函数及析构函数的调用顺序
简单来说,其构造函数的顺序就一句话:基类构造函数 -> 成员的构造函数 -> 构造函数体内语句看下面一个代码示例:#include <iostream>using namespace std;class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; }};class B {转载 2020-08-28 00:24:19 · 217 阅读 · 0 评论 -
C++ deque底层实现
deque容器的存储结构和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。为了管理这些连续空间,deque 容器用数组(数组名假设为 map)存储着各个连续空间的首地址。也就是说,map 数组中存储的都是指针,指向那些真正用来存储数据的各个连续空间(如图 1 所示)。图1 deque容器的底层存储机制通过建立 map 数组,deque 容器申请的这些分段的连续空间就能实现“整体连续”的转载 2020-08-22 12:57:15 · 2270 阅读 · 1 评论 -
C++ 编译器多态与运行时多态
前言今日的C++不再是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。运行期多态运行期多态的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些转载 2020-08-22 01:06:05 · 988 阅读 · 0 评论 -
C++ vector的内部实现原理及基本用法
本文基于STL vector源代码,但是不考虑分配器allocator,迭代器iterator,异常处理try/catch等内容,同时对_Ucopy()、 _Umove()、 _Ufill()函数也不会过度分析。一、vector的定义template<class _Ty, class _Ax> class vector : public _Vector_val<_Ty, _Ax> { // varying size array of v转载 2020-08-03 22:10:22 · 6625 阅读 · 0 评论 -
C++中虚函数的作用
C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要再派生类中声明该方法为虚方法。当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即B b; A a = & b;] 父类指针根据赋给它的不同子类指针,动态的调用子类的该函数,而不是父类的函数(如果不使用virtual方法,请看后面★),且这样的函数调用发生在运行阶段,而不是发生在编译阶段,称为动态联编。而函数的重载可以认为是多态,只不过是静态的。注意,非虚转载 2020-08-03 21:18:04 · 2578 阅读 · 0 评论 -
C++友元函数和友元类
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:class Box{ double width;public: double length; f转载 2020-08-03 12:20:55 · 124 阅读 · 0 评论 -
C++容器适配器之priority_queue
定义:priority_queue<Type, Container, Functional>Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆一般是://升序队列priority_queue <int,vec转载 2020-08-03 10:15:42 · 164 阅读 · 0 评论 -
C++中为何析构函数总是虚函数?
问题:为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?答案:编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC转载 2020-07-30 12:22:48 · 326 阅读 · 0 评论 -
C++中std::function和std::bind
1、可调用对象可调用对象有一下几种定义:是一个函数指针,参考 C++ 函数指针和函数类型;是一个具有operator()成员函数的类的对象;可被转换成函数指针的类对象;一个类成员函数指针;C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。不同类型可能具有相同的调用形式,如:// 普通函数int add转载 2020-07-24 01:18:16 · 207 阅读 · 0 评论 -
C/C++中存储类型
c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有 数据区、bbs区、栈区、堆区。下面来看一下这几个存储类型:1、auto存储类型auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。2、...转载 2020-03-25 22:05:28 · 566 阅读 · 0 评论 -
C/C++中链接属性
标识符的链接属性决定处理在不同文件中出现的标识符,一共分三种-none(无)、external(外部)和 internal(内部)。1、none:函数形式参数和代码块内声明的变量在缺省情况下具有none链接属性 。2、external:并非声明于代码块内的变量,缺省情况下具有external链接属性,(函数名也不包含于任何代码块)。3、缺省情况下,除了上述说明的external属性以外,其余...转载 2020-03-25 22:24:45 · 700 阅读 · 0 评论 -
C/C++中作用域
作用域当变量在程序中的某个部分被声明时,它只有在程序的一定区域才能被访问。这个区域由标识符的作用域(scope)决定。标识符的作用域就是程序中该标识符可以被使用的区域。例如,函数的局部变量的作用域局限于该函数的函数体。编译器可以确认4种不同类型的作用域:文件作用域、函数作用域、代码块作用域和原型作用域。标识符声明的位置决定它的作用域。代码块作用域位于一对花括号之间的所有语句称为一个代码块...转载 2020-03-25 21:28:14 · 573 阅读 · 0 评论 -
C++中static关键字作用
1、对于函数定义和代码块之外的变量声明,static修改标识符的链接属性,由默认的external变为internal,作用域和存储类型不改变,这些符号只能在声明它们的源文件中访问。2、对于代码块内部的变量声明,static修改标识符的存储类型,由自动变量改为静态变量,作用域和链接属性不改变。这种变量在程序执行之前就创建,在程序执行的整个周期都存在。3、对于被static修饰的普通函数,其只能...原创 2020-03-25 22:41:20 · 221 阅读 · 0 评论 -
C/C++中extern关键字
1、 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 此外extern也可用来进行链接指定。extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中...转载 2020-03-24 23:33:32 · 193 阅读 · 0 评论 -
C++中重载(overload)和重写(override)和隐藏
1、成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。2、重写是指派生类函数重写基类函数,是C++的多态的表现,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。3、隐藏规则(屏蔽现象)是指派生类的函数屏蔽了与其同名的基类函...转载 2020-03-23 13:38:54 · 212 阅读 · 0 评论 -
C++中sizeof问题
1、对于类和对象Class A; A obj;则sizeof(A)==sizeof(obj)一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的。对象大小= 虚函数表指针(4个字节) + 所有非静态数据成员大小 + 对齐字节大小注意:如果没有定义虚函数,则不用计算虚函数表指针对齐字节大小符合规律:结构体变量的首地址能够被其最宽基本类型成...原创 2020-03-18 16:35:20 · 279 阅读 · 0 评论 -
C++中拷贝构造函数的形参为什么要是const引用
1.首先为什么要是引用:如对于CBox(CBox initB);//复制构造函数一开始想到的原型CBox cigar;CBox myBox(cigar); //如果编写这样一条语句//那么将生成这样一条对复制构造函数的调用CBox::CBox(cigar);因为实参是通过按值传递机制传递的。在可以传递对象cigar之前,编译器需要安排创建该对象的副本。**因此,编译器为了处理复制构造...转载 2020-03-18 15:07:02 · 866 阅读 · 0 评论 -
C++中为何构造函数不可是虚函数,而析构函数可以?
构造函数也不可以是虚函数:从实现上看,虚函数表在构造函数调用后才建立,因而构造函数不可能成为虚函数从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化,在对象生命期只执行一次,不是对象的动态行为,也没有太大的必要成为虚函数析构函数可以是虚函数:在继承体系中,基类的析构函数一般声明成虚函数,因为子类要重新定义它用来销毁对象...转载 2020-03-18 01:11:34 · 183 阅读 · 0 评论 -
C++析构函数何时被调用
一般我们都知道构造和析构的次序:构造从类层次的最根处开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器将无法自动执行析构过程。构造函数和析构函数都是由编译器隐式调用的。这些函数的调用顺序取决于程序的执行进入和离开实例化对象时所在的那个作用域的顺序。一般而言,析构函数的调用顺序和构造函数的调用顺序相反,但是,对...转载 2020-03-18 00:36:21 · 5605 阅读 · 0 评论 -
C++虚函数表
对于这样一个类:class Base { public: virtual void f() { cout << "Base::f" << endl; } virtual void g() { cout << "Base::g" << endl; } virtual...转载 2020-03-18 00:05:51 · 103 阅读 · 0 评论 -
C++ inline函数和宏
这篇文章讲的很好:https://blog.csdn.net/BjarneCpp/article/details/76044493转载 2020-03-04 16:08:20 · 395 阅读 · 1 评论 -
C++中自增运算符问题
在前置后置自增符方面存在点困惑,现在总结如下:1、自增运算符作为函数参数参见这篇文章:函数参数进栈以及自增运算在函数调用中的trick其中重点是,栈的参数是从右向左压栈的前置自增符返回的是引用,后置自增符返回的是值2、运算符优先级主要是来判断结合顺序比如像下图这种类型的情况,就没什么结合顺序去考虑的,有先后顺序但是无关紧要for(int i=0;i<10;i++){};...原创 2020-03-02 16:41:44 · 296 阅读 · 0 评论 -
C++中类的静态成员变量和静态成员函数
主要注意有几点区分:1、类的静态成员函数不能调用非静态成员函数原因:因为类的静态成员函数在未实例化对象之前类加载的时候就已经分配空间,而非静态成员函数在实例化对象之后才分配空间,所以类的静态成员函数不能调用非静态成员函数。2、类和对象都可以调用静态成员函数,但是静态成员函数无this指针,所以本质上都是通过::调用原因:因为静态成员函数是属于类的, 所以类和对象都可以调用3、非静态成员函...原创 2020-02-29 23:19:32 · 668 阅读 · 0 评论 -
C++中const引用和非const引用的使用注意
今天学习时突然有疑惑,C++有了指针为何还要设计引用呢?后来看到一篇博客豁然开朗:为什么 C++ 有指针了还要引用?总结一下:1、代码更加简洁好看了2、由于引用必须被初始化,并且之后也无法修改绑定的对象,这样就更安全了3、为了操作符重载,比如博客中那个重载 [ ]的例子并且,在了解了这些之后,对引用的一些其他特性也就一目了然了。1、const 引用只可读不可写,可以绑定不同类型的con...原创 2020-02-28 21:22:36 · 1212 阅读 · 0 评论 -
C++多线程编程
关于C++多线程编程非常详细的一篇文章:https://zhuanlan.zhihu.com/p/97239796转载 2020-02-27 23:38:55 · 159 阅读 · 0 评论 -
C++ algorithm中find系列函数总结
主要是对find , find_first_of , find_end , find_if , find_if_not这五函数做个总结:我写了这个代码:#include<iostream>#include<map>#include<vector>#include<string>#include<algorithm>usin...原创 2019-12-04 14:27:05 · 2417 阅读 · 0 评论 -
C++中vector的capacity和size的区别
vector中capacity是指最少要多少元素才会使容器重新分配,reserve()可以设置capacity值。size是指容器中有多少个元素,resize()可以修改容器大小。乍一看,如果没有没有使用reserve()的话,vector的size和capacity应该是相同的,但是不见得。代码1int m,n;n=obstacleGrid.capacity();m=obstacl...原创 2019-10-01 17:44:09 · 1156 阅读 · 0 评论 -
C/C++循环输入问题
最近做算法遇到了循环输入的问题,下面有教程:https://blog.csdn.net/QW_sunny/article/details/80924279转载 2018-11-16 20:46:21 · 13796 阅读 · 0 评论 -
C++ 汉明码
汉明码,巧妙的办法int hammingDistance(int x,int y){ int n=x^y,distance=0; while(n) { distance++; n&=n-1; } return distance;}原创 2018-02-23 12:15:23 · 1712 阅读 · 0 评论