
C++
文章平均质量分 90
瘦弱的皮卡丘
2018
展开
-
std::move()与移动构造函数
目录std::move()C++移动构造函数std::move()std::move的功能是将一个左值强制转化为右值引用,并返回该右值引用,继而可以通过右值引用使用该值,以用于移动语义(移动构造函数或移动赋值运算符)。std::move 的函数原型定义template <typename T>typename remove_reference<T>::type&& move(T&& t){ return static_c原创 2022-01-17 14:44:35 · 3845 阅读 · 0 评论 -
C++ | C++的四种类型转换
一.const_castconst_cast类型的转换指的是去掉常量属性的一种类型转换。例如,在C语言中,我们可以进行以下操作const int a = 10;int* p1 = (int*)&a;而如果在C++中,就可以使用以下语法const int a = 10;int* p2 = const_cast<int>(&a);这两种方法所生成的指令是一样的,但二者在编译期间的处理方式是有所不同的,例如在C语言中const int a =原创 2020-10-24 14:43:59 · 337 阅读 · 0 评论 -
C++ | 继承多态笔试面试题实战分析
目录例题一例题二例题三例题四例题五例题一#include<iostream>#include<string>using namespace std;class Animal{public: Animal(string name) :_name(name){} virtual void bark() = 0;protected: string _name;};class Cat :public Animal{publi...原创 2020-10-10 14:34:08 · 435 阅读 · 0 评论 -
C++ | 引用和常引用 | 引用和常引用的区别
目录引用常引用引用引用是一种更安全的指针,因为引用在底层是以指针的方式处理的,针对于引用变量使用的地方,系统自带解引用过程,也就是说引用变量占有内存空间,即在下面这个例子中,b中存放的是a的地址。#include<iostream>int main(){ int a = 10; int &b = a; return 0;}使用引用时需要注意的事项引用一定要初始化 引用是不能改变的,例如,上面b已经是a的别名,所以b不能成为c原创 2020-09-22 08:41:57 · 1734 阅读 · 0 评论 -
C++ | 指向类成员的指针
#include<iostream>using namespace std;class Test{public: void func() { cout << "call Test::func" << endl; } static void static_func() { cout << "call Test::static_func" << endl; } int ma; static int mb;};...原创 2020-09-22 08:37:09 · 349 阅读 · 0 评论 -
C++ | const在C和C++中的区别 | 常量和常变量的区别
C语言中的constC语言中被const修饰的变量被称为 常变量,并且定义一个常变量时可以不对它进行初始化。如下图所示,我们没有对常变量a进行初始化,但程序依然可以正常运行。当如果我们在定义一个常变量时没有对它进行初始化,则后续就无法再对它进行赋值。我们也无法直接修改a的值但这些并不意味意味着a就是一个常量,他依然是一个常变量,例如我们可以通过指针来修改常变量a的值C中处理const修饰的变量规则是,在编译间段看常变量有没有做左值,如果做了左值,以后就将此常变量.原创 2020-09-17 10:17:51 · 505 阅读 · 0 评论 -
C++ | new关键字 | new和malloc的区别
new和malloc的区别 new malloc new不需要传入开辟内存的大小 malloc需要传入开辟内存的大小 new和delete是两个关键字 malloc和free是两个函数 new的返回值类型安全 malloc的返回值(void*)不安全 new开辟内存失败时,抛出异常 malloc开辟内存失败时,返回NULL new不仅能开辟内存,还能进行初始化 malloc只能开辟内存,不能初始化 new开辟的内存叫做自由存储区 mal原创 2020-09-16 22:01:33 · 206 阅读 · 0 评论 -
C++ | 形参带默认值的函数
#include<iostream>int sum(int a=10,int b=20){ return a+b;}int main(){ int a = 10; int b = 20; int ret = sum(a,b); /* mov eax,dword ptr[ebp-8] push eax mov ecx,dword ptr[ebp-4] push ecx call sum */.原创 2020-09-16 09:45:56 · 449 阅读 · 0 评论 -
C++ | 函数重载
一.什么是函数重载C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。一组函数要称得上重载,一定先是处于同一个作用域当中的。一组函数,函数名相同,参数列表也相同,仅仅是返回值不同,不能被称作重载。二.C++为什么支持函数重载,C语言为什么不支持函数重载?因为在C语言中,函数符号的生成规则只与函数名有关,所以不能有重名的函数,而C++的函数符号生成规则与函数原型有关。函数原创 2020-09-16 09:37:41 · 265 阅读 · 0 评论 -
C++ | 内敛函数 | 内敛函数的性质 | 内敛函数的特点 | 内联函数和普通函数的区别
目录一.什么是内联函数二.内联函数和宏的区别三.内联函数和static修饰的函数的区别四.使用inline的时机五.内敛函数的缺点六.使用内联函数时需要注意的事项一.什么是内联函数例如现在有如下一个函数int sum(int x,int y){ return x+y;}虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧的开辟和回退过程,这会给系统带来很大的开销。因此我们可以使用内联函数。inline int sum(int原创 2020-09-15 20:09:40 · 1252 阅读 · 0 评论 -
C++ | 函数模板的重载(模板重载)
所谓的函数模板的重载是指,普通函数的版本,函数模板的版本和函数模板特例化的版本可以共存,例如://普通函数版本bool Compare(char* a, char* b){ cout << "普通函数版本" << endl; return strcmp(a, b) > 0;}//函数模板版本template<typename T>bool Compare(T a, T b){ cout << "函数模板版本" <<原创 2020-07-18 12:47:10 · 5511 阅读 · 1 评论 -
C++ | C语言和C++的函数符号的生成规则
在C语言中,函数的生成规则和函数名称相关,即只要函数名称相同,就算函数的返回值类型不同,函数的形参不同,最终生成的函数的符号都相同,例如:int Sum(int a,int b){ return a+b;}double Sum(double a,double b){ return a+b;}上述这两个函数最终生成的函数符号都是_Sum,所以最终程序运行时会报错。而在C++中,函数的生成规则和函数的整体相关,即最终生成的函数符号和函数的返回值+函数名+函数的形参列原创 2020-07-15 19:46:25 · 728 阅读 · 0 评论 -
C++ | 什么是实模式和保护模式
一.实模式早期的操作系统的对进程的处理模式属于实模式,即程序的运行需要内存,而实模式就是将程序直接加载到内存当中。假如此时同时有个进程B也被加载到内存中,即但如果这个进程B为恶意程序或者病毒。如果进程B使用指针加偏移的方式来随意的跳转,例如跳转到进程A的内存空间,那么此时进程B就可以随意的修改进程A的指令和数据。这是一种极大的安全漏洞。二.保护模式为了解决实模式存在的安全漏洞,人们在80386(80386以后的操作系统又被称为X86体系)以后的操作系统使用保护模式。 即,运行进程原创 2020-07-09 20:48:36 · 657 阅读 · 0 评论 -
C++ | STL空间适配器
我们知道容器的底层都是数据结构,如果我们在表层对一个容器频繁的进行插入或删除元素,也就是说在底层的数据结构上就会频繁的new和delete,这将会导致以下问题:效率太低,系统要频繁的从用户态切换到内核态,这样不仅会费时,还会浪费许多资源。 造成内存碎片化。为了解决以上问题,我们可以使用一个内存池来处理,首先开辟一个大的内存单元,每次在插入元素时,就从内存池中选择一块内存来做元素的插入,删...原创 2020-03-30 13:24:16 · 842 阅读 · 0 评论 -
C++ | 观察者模式
目录一.观察者模式二.代码实现一.观察者模式观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:...原创 2020-03-21 22:49:49 · 763 阅读 · 1 评论 -
C++ | STL 单映射容器map
目录一.何为单映射容器map二.map容器的使用方法一.何为单映射容器map在简绍这map容器之前我们先来看另一个概念——键值对。所谓的键值对是由 键(key) 和 值(value) 两部分组成的,一个键对应一个值,值可以重复,但是键不能重复。例如我们可以将身份证号对应为键(key),而某个身份证号对应的名字称为值(value),而我们都知道身份证号是不可以重复的,人手一个,但...原创 2020-03-20 22:01:39 · 370 阅读 · 0 评论 -
C++ | STL 单集合容器set和多集合容器multiset
set指的是单集合容器,所谓的单集合容器指的是容器里面的数据不能重复,所需要的头文件为#include<set>,其底层为红黑树。一.set常用的构造方式#include<iostream>#include<set>#include<algorithm>template<typename Container>void ...原创 2020-03-20 19:57:11 · 398 阅读 · 0 评论 -
C++ | STL 迭代器
一.迭代器的划分在容器类中一般都会提供四种的迭代器iterator:普通迭代器。 const_itrerator :常量迭代器,常量迭代器 迭代 常容器对象。 reverse_iterator :反转型迭代器。 const_reverse_iterator:常量反转型迭代器,迭代常量容器对象。#include<iostream>#include<vector&...原创 2020-03-19 16:34:11 · 824 阅读 · 0 评论 -
C++ | STL deque容器
一.简述deque容器deque是一个双端队列容器,其在低端为一个双端队列,所需要的头文件为#include<deque>。正如上图所示,双端队列的每一个端口都既能出,又能进。但我们一般在使用双端队列时,使用的都是受限的双端队列,即我们选定双端队列的某一端只能进(插)元素,相反的,另一端就只能出元素。deque的底层是双端队列,所以底层的内存空间是连续的,因此我们可...原创 2020-03-17 17:34:07 · 1345 阅读 · 2 评论 -
C++ | STL list容器
目录一.简述list容器二.list容器创建方式三.list容器的插入和删除操作四.关于list容器迭代器的使用方法一.简述list容器list是双向链表容器,也就是说它的底层是一个双向循环链表。所需头文件#include<list>因为list是双向链表容器,所以它的逻辑地址连续,但是它的物理地址并不连续,因此我们不能使用指针的直接跳转来访问该双向链...原创 2020-03-16 19:53:57 · 459 阅读 · 0 评论 -
C++ | STL vector容器
vector的使用方式#include<iostream>#include<vector>//vector容器的头文件#include<iterator>//迭代器的头文件int main(){ std::vector<int> vec1;//默认构造函数 所有容器 都有默认构造函数 std::vector<int&...原创 2020-03-15 21:18:22 · 404 阅读 · 0 评论 -
C++ | 函数的堆栈调用过程
#include<iostream>int sum(int a, int b){ int tmp = 0; tmp = a + b; return tmp;}int main(){ int a = 12; int b = 0; int ret = sum(a, b); std::cout << ret << std::endl; ...原创 2020-03-11 11:24:42 · 1801 阅读 · 0 评论 -
C++ | 进程虚拟地址空间区域的划分
以下代码的均执行在 x86系统 32位linux环境下#include<iostream>int gdata1 = 10;int gdata2 = 0;int gdata3;static int gdata4 = 11;static int gdata5 = 0;static int gdata6;int main(){ int a = 12; int...原创 2020-03-10 15:31:20 · 587 阅读 · 1 评论 -
C++单例模式(Singleton Pattern)
单例模式单例模式(Singleton Pattern)是面向对象语言例如C++ 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。 2、单例类必须自己创...原创 2020-02-28 15:07:19 · 509 阅读 · 0 评论 -
指针函数与函数指针
一.指针函数指针函数就是一个返回值类型为指针的函数,其本质为一个函数,只不过这个函数的返回值为一个指针,例如#include<iostream>int* Compare(int* a, int* b){ return *a >= *b ? a : b;}int main(){ int* a = new int(10); int* b = new in...原创 2020-02-28 13:10:55 · 291 阅读 · 0 评论 -
C++工厂模式
目录一.简单工厂模式二.工厂方法模式三.抽象工厂模式一.简单工厂模式假设现在有一家工厂生产苹果,梨两种水果,其中苹果的编号为1,梨的编号为2,若某个商家与该工厂合作,生产水果时,不需要说明水果的名字,只需要水果的编号即可,即若代号为1则生产苹果,代号为2则生产梨。#include<iostream>#include<string>cla...原创 2020-02-27 23:38:49 · 1230 阅读 · 0 评论 -
虚表的写入时机以及虚表的二次写入
虚标的写入时机虚标的写入时机指的是虚函数指针指向虚函数表的时机,在C++中创造一个对象要分为两步:1.开辟内存 2.调用构造函数 ,也就是说当完成第一个步骤后,对象的内存就已经被开辟完成了,那么内存中的虚函数指针是什么时候指向虚函数表的呢,首先我们假设虚函数指针是在构造函数之前指向虚函数表的。下面我们用一个例子来探讨这个问题。include <iostream>class...原创 2020-02-25 14:57:28 · 1638 阅读 · 2 评论 -
五、多态与虚函数,虚函数指针,虚函数表——带动图详解
一.多态1.多态的概念:多态性是面向对象程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。作用:利用多态性技术,可以调用相同函数名的函数,实现完全不同的功能。C++中有三种:编译时多态(静多态),运行时多态(动多态)以及宏多态编译时多态:函数重载与运算符重载,在函数或运算符调用前就知道具体调用哪个同名函数或运算符。 运行时多态:必须在程序执行过程中,根据执...原创 2020-02-23 15:28:18 · 1163 阅读 · 1 评论 -
四、同名隐藏,继承的特性——赋值兼容规则
目录一.子类中的函数同名隐藏二.继承的特性——赋值兼容规则一.子类中的函数同名隐藏1.同名隐藏的概念:设在某一继承关系中,子类中有一个和父类中同名的函数 show(),那么子类在调用show()方法时,系统将调用子类的show()方法,而不会去调用父类的show()方法,这种现象叫做同名隐藏。(切记:这里的show()方法不是我后面所说的多态,仅仅称之为同名隐藏)。例如:...原创 2020-02-13 17:43:14 · 446 阅读 · 0 评论 -
三、多继承情况下:钻石继承、虚拟继承与虚基类
目录1、来自不同父类的相同成员的访问问题2、多继承中的钻石继承问题3、钻石继承问题的解决方法4、在使用虚基类的情况下,构造父类的顺序问题1、来自不同父类的相同成员的访问问题多继承情况下,来自不同父类的相同成员的访问问题 :假设子类继承自2个父类,这两个父类中包含有同名的(数据)成员n,这时通过对象直接来访问该(数据)成员n时会出现什么问题?从继承的角度讲,该数...原创 2020-02-11 11:34:05 · 374 阅读 · 0 评论 -
二、继承类型、派生类的构造函数和析构函数
一.继承的分类单继承:一个派生类只有一个直接基类的情况称为单一继承(single-inheritance)。 多重继承:如果一个派生类可以同时有多个基类,称为多重继承(multiple-inheritance),这时的派生类同时得到了多个已有类的特征。1.在使用派生类实例化对象时调用了父类的构造函数和派生类的构造函数,下面是单继承情况:#include<iostream>...原创 2020-02-04 19:04:03 · 750 阅读 · 0 评论 -
一、继承的基本概念、定义方法及访问限定
目录一.继承的基本概念、定义派生类二.继承和访问的区别三.访问限定符四.保护继承和私有继承的区别一.继承的基本概念、定义派生类面向对象的四个基本特征:抽象,封装,继承和多态,其中最主要的特征是继承和多态。继承:可对类(class)分层,提供类型/子类型的一种机制。通过类派生(class derivation)的机制来支持继承。被继承的类称为基类(base class...原创 2020-02-04 16:24:07 · 508 阅读 · 0 评论 -
类和对象考试题
1.请写出下面这个类的方法代码(20分)class String{public: String(char *pstr); ~String(); String(const String &src); void operator=(const String &src);private: char *_pstr;}; 答案:...原创 2019-11-22 23:16:12 · 265 阅读 · 0 评论 -
C++实现栈
目录一.顺序栈二.链栈栈的特点:先进后出一.顺序栈class Stack{public: Stack() { parr = new int[2]();//初始化栈的大小为2 top = 0; totalsize = 2; } Stack(const Stack& rhs) { //深拷贝 parr = ne...原创 2019-11-08 21:59:46 · 211 阅读 · 0 评论