
C++知识分享
文章平均质量分 56
c++知识点积累
JachinYang
不为失败找借口,只为成功找方法!!!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++---面经总结三(本人校招面试中,持续更新......)
1、C++移动构造函数?我们用对象a初始化对象b,然后对象a就不再使用了,但是对象a的空间还在(在析构之前),既然调用拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么不直接使用a的空间?这样就避免了新的空间的分配,大大降低了构造的成本,这就是移动构造函数设计的初衷; 默认的拷贝构造函数,实际上就是一种浅拷贝,如果说类对象不占用外部资源(堆资源),那么这种浅拷贝是没有啥问题的;但如果对象占有外部资源,也就是存在指针成员指向堆内资源,那么这种浅拷贝就要发生问题了,因为此时两个指针指向堆内同原创 2021-09-11 12:44:20 · 272 阅读 · 0 评论 -
C++---面经总结二(本人校招面试中,持续更新......)
1、main函数之前执行和之后执行的代码可能有哪些?main函数之前:设置栈指针,开辟main函数栈帧,main函数有参数的话进行参数压栈; 初始化静态变量和全局变量,也就是 .data 段内容; 将未初始化的全局变量进行初始化为0(其中bool型为false),也就是 .bss 段内容; 全局对象的初始化,在main函数之前调用构造函数;main函数之后:全局对象的析构函数会在main函数之后执行; 由atexit注册的函数,会在main函数执行之后执行;可以多次调用注册多个,但执行原创 2021-08-31 22:46:39 · 397 阅读 · 0 评论 -
C++---面经总结一(本人校招面试中,持续更新......)
C++this指针是干什么用的?一个类定义了很多对象,对于每个对象它们有自己的成员数据,但是它们共享一套成员方法,那么在成员方法里面是如何区分是哪个对象调用该方法,那就是通过this指针。C++普通的成员方法被编译之后都会多出来一个this指针参数,用来接收调用该方法的对象的地址。C++的new和delete,什么时候用new[ ]申请,可以用delete释放?引申以下:malloc和new的区别? malloc是按字节开辟内存的;new开辟内存时需要指定类型newint[10],..原创 2021-08-24 01:34:47 · 966 阅读 · 0 评论 -
C++ --- 继承结构下类对象的内存布局
目录virtual应用场景:普通继承(不含虚函数)普通继承(含虚函数)虚继承(不含虚函数)虚继承(含虚函数)首先,明确几个概念:抽象类:含有纯虚函数的类叫做抽象类,抽象类不能实例化对象,但是可以定义指针或者引用变量,在实际开发中,我们一般把基类设计成抽象类;虚基类:被虚继承的类叫做虚基类,也就是在继承方式前添加了virtual关键字;virtual应用场景:修饰成员方法,表明该方法是虚函数,含有虚函数的类会自动添加一个虚函数指针(vfptr)成员数据,vfptr指向虚原创 2021-08-14 19:05:11 · 593 阅读 · 0 评论 -
C++ --- 虚函数与动态绑定
首先抛出问题: 是不是虚函数的调用一定就是动态绑定? ( 肯定不是) 在类的构造函数中,调用虚函数,也是静态绑定(构造函数中调用其它任何函数,都不会发生动态绑定)。也就是说在有对象之前是不能发生动态绑定的,构造函数执行完才能生成对象;其次,如果不是通过指针或者引用变量来调用虚函数,而是通过对象来调,那就是静态绑定。示例代码:#include<iostream>using namespace std;/* 虚函数与动态绑定 问题:是不是虚函数的调用原创 2021-08-14 12:24:41 · 1092 阅读 · 0 评论 -
C++ --- 虚析构函数
首先抛出几个问题: 哪些函数不能实现成虚函数?(构造函数和静态的成员方法) 构造函数不能是虚函数,析构函数可以是虚函数,为什么? 什么时候把基类的析构函数必须实现成虚函数? 虚函数的依赖虚函数能产生地址,存储在vftable中; 对象必须存在(vfptr -> vftable -> 虚函数地址) 所以: 构造函数不能是虚函数,先执行构造函数才能产生对象,然后才能找到虚函数表,反过来都找不到构造函数; 构造函数中调用任何函数,都是静态绑...原创 2021-08-14 12:20:01 · 441 阅读 · 0 评论 -
C++ --- 虚函数、静态绑定、动态绑定
首先明确一个在类继承结构中出现的名词:覆盖覆盖:如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数,它们之间成为覆盖关系;也就是说派生类会在自己虚函数表中将从基类继承来的虚函数进行替换,替换成派生类自己的。静态绑定:编译时期的多态,通过函数的重载以及模板来实现,也就是说调用函数的地址在编译时期我们就可以确定,在汇编代码层次,呈现的就是 call 函数名;动态绑定:运行时期的多态,通过派...原创 2021-08-14 12:09:18 · 358 阅读 · 0 评论 -
C++ ---重载、覆盖、隐藏
1.重载关系:一组函数要重载,必须处在同一个作用域,而且函数名相同,参数列表不同.#1与#2就是重载关系2.隐藏关系:(作用域的隐藏)在继承结构中,派生类的同名成员函数,把基类的同名成员函数(非虚函数)给隐藏掉了 #1和#3#2和#3都是隐藏关系如果想调用基类同名成员函数,就得添加基类作用域Base::3.覆盖关系:虚函数表中虚函数地址的覆盖;如果...原创 2021-08-14 11:53:27 · 228 阅读 · 0 评论 -
C++ --- 派生类的构造过程
目录派生类怎么初始化从基类继承来的成员变量?派生类对象构造和析构的过程示例代码首先,派生类从基类可以继承来所有的成员(成员变量和成员方法)。派生类怎么初始化从基类继承来的成员变量?解答:通过调用基类相应的构造函数来初始化派生类的构造函数和析构函数,负责初始化和清理派生类部分; 派生类从基类继承来的成员的初始化和清理由基类的构造函数和析构函数来负责。派生类对象构造和析构的过程: 派生类调用基类的构造函数,初始化从基类继承来的成员; 派生类调用自己...原创 2021-08-12 14:06:44 · 763 阅读 · 0 评论 -
C++ --- 继承的本质和原理
类继承的本质代码复用 实现多态的基础类之间的关系组合:a part of... 一部分的关系 继承:a kind of... 一种的关系继承方式继承方式 基类的访问限定 派生类的访问限定 外部访问限定 public public public YES protected protected NO private 不可见 NO protected .原创 2021-08-12 13:58:14 · 851 阅读 · 0 评论 -
C++-理解函数模板
相关知识点:函数模板:它是模板,不进行编译(因为类型不知道),在模板的调用点根据用户指定的参数类型,进行实例化生成模板函数,再参与编译; 模板的实例化:函数调用点进行实例化; 模板函数:才是要被编译器所编译的; 模板的实参推演:可以根据用户传入的实参的类型,来推导出模板类型参数的具体类型; 模板的特例化:特殊(不是编译器提供的,而是用户提供的)的实例化; 模板代码是不能在一个文件中定义,在另一个文件中使用的; 模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能够进行...原创 2021-08-10 18:05:25 · 159 阅读 · 0 评论 -
C++设计模式---代理模式
设计模式概念简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。代理模式的作用代理模式也称为委托模式,作用就是找一个对象来替我们访问某个对象意图:为其它对象提供一种代理以控制...原创 2021-08-10 18:00:24 · 282 阅读 · 0 评论 -
C++智能指针
在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。...原创 2021-08-09 18:40:48 · 886 阅读 · 0 评论 -
C++设计模式---工厂模式
设计模式概念简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。工厂模式分类简单工厂 Simple Factory 工厂方法 Factory Method 抽象工厂 Abstract Factory针对以上三种模式,先给出结论如下:简单工厂不符合软件设计的开-闭原则,由此改进产生工厂方法 工...原创 2021-08-09 14:39:01 · 439 阅读 · 0 评论 -
C++设计模式---单例模式
目录为什么需要设计模式什么是单例模式?饿汉式:线程安全的懒汉式单例模式方法1:线程安全的懒汉式单例模式方法2:为什么需要设计模式简单来说,设计模式就是在解决某一类问题时,有既定的优秀的代码框架可以用,优点如下:代码易于维护; 能够做到软件设计的开-闭原则(对修改关闭,对扩展开放); 合理的设计模式,能够做到软件设计的高内聚,低耦合。什么是单例模式?单例模式指的是,你无论怎么获取,永远只能得到该类的一个实例对象,所以单例模式的设计有如下三步曲:构造函数私有化,原创 2021-08-09 14:04:53 · 195 阅读 · 0 评论 -
C++中的重载、重写、和隐藏的区别
1、重载(overload)重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关。举个例子:...转载 2021-06-01 14:52:05 · 672 阅读 · 0 评论 -
构造函数和析构函数能否声明为虚函数或者纯虚函数
析构函数:析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数。只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。...原创 2021-06-01 14:33:45 · 1976 阅读 · 0 评论 -
为什么基类析构函数一般写成虚函数
由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。..原创 2021-06-01 14:17:45 · 2952 阅读 · 0 评论 -
final与override关键字
override当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:class A{virtual void foo();}class B : public A{void foo(); //OKvirtual void foo(); // OKvoid foo() override; //OK}...原创 2021-05-30 21:29:17 · 178 阅读 · 0 评论 -
C++中const和static的作用
static不考虑类的情况隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用考虑类的情况static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为原创 2021-05-30 21:17:34 · 303 阅读 · 0 评论 -
C++中struct和class的区别
相同点两者都拥有成员函数、公有和私有部分任何可以使用class完成的工作,同样可以使用struct完成不同点两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的class默认是private继承,而struct模式是public继承引申:C++和C的struct区别C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)C中struct是没有权限的设置的原创 2021-05-30 21:02:59 · 449 阅读 · 0 评论 -
野指针和悬空指针
都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。野指针野指针,指的是没有被初始化过的指针原创 2021-05-30 20:51:13 · 340 阅读 · 0 评论 -
宏定义、函数、typedef
宏定义和函数有何区别宏在编译时完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数。宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值。宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型。宏定义不要在最后加分号。宏定义和typedef区别...原创 2021-05-30 20:28:04 · 327 阅读 · 0 评论 -
new/delete与malloc/free
相同点:都可用于内存的动态申请和释放不同点:new/delete是C++运算符,malloc/free是C语言标准库函数原创 2021-05-30 20:14:30 · 183 阅读 · 0 评论 -
C++ this 指针
引言:首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。注意:this指针并不是对象的一部分,this指针所占的内存大小是不会反应在sizeof操作符上的。this指针的类型取决于使用this指针的成员函数类型以及对象类型,————————————————版权声明:本文为CSDN博主「我是一名好学者」的原创 2021-05-28 15:41:36 · 143 阅读 · 0 评论 -
C++中 NULL 和 nullptr 区别
算是为了与C语言进行兼容而定义的一个问题吧NULL来自C语言,一般由宏定义实现,而 nullptr 则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下:#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif意思就是说当原创 2021-05-28 14:44:11 · 262 阅读 · 0 评论