C++虚函数的实现原理
[TOC]
概述文章参考:https://jacktang816.github.io/post/virtualfunction/
c++作为面向对象的语言,主要有三大特性:继承、封装、多态。关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时绑定,要么试图做到运行时绑定。因此C++的多态分为静态多态(编译时多态)和动态多态(运行时多态)两大类。静态多态通过重载、模板来实现;动态多态就是通过本文的主角虚函数来体现的。
实际上,当一个类中包含虚函数时,编译器会为该类生成一个虚函数表,保存该类中虚函数的地址。同样派生类继承,派生类中自然一定有虚函数,所以编译器也会为派生类生成自己的虚函数表。当我们定义一个派生类对象编译器会检测该类是否有虚函数,所以为这个派生类对象生成一个虚函数指针,指向该类型的虚函数表,这个虚函数指针的初始化实在构造函数中完成的。
虚函数对C++ 了解 ...
C++运算符重载基础学习
[TOC]
概述
Android之性能监控框架
[TOC]
文章参考:http://c.biancheng.net/view/7231.html
C++ STL 标准库中提供有 4 种无序关联式容器,本节先讲解 unordered_map 容器。
unordered_map 容器,直译过来就是”无序 map 容器”的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。
对于已经学过 map 容器的读者,可以将 unordered_map 容器等价为无序的 map 容器。
具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。但由于 unordered_map 容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。
值得一提的是,unordered_map 容器在<uno ...
C++中数据结构Vector基础
[TOC]
概述什么是vector数组
vector是向量类型
vector数组是可以存放任意数据类型的动态数组
和普通数组类似,可以通过下标对数组中的元素进行引用
vector的基本操作
使用vector数组要在头文件中加 #include
vector数组的声明
1vector<int> vector;//声明一个存放int型的向量
vector数组的初始化
12345678vector<int> vec(1,2,3,4,5,6);//vec中的内容为1,2,3,4,5,6vector<int> vec(a);//声明并用a向量初始化vec向量int a[5]={1,2,3,4,5};vector<int> vec(a,a+5);//将a数组的元素用来初始化vector向量vector<int> vec(&a[1],&a[4]);//将a[1]-a[4]范围内的元素作为vec的初始值
向vector中插入元素
12345678910//在vector的末尾插入新元素vec ...
Android之性能监控框架
[TOC]
概述list 由双向链表(doubly linked list)实现而成,元素也存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供 [] 操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的插入和删除操作。
list使用list定义和初始化使用之前必须加相应容器的头文件:
1#include <list> // list属于std命名域的,因此需要通过命名限定,例如using std::list;
定义的代码如下:
12345list<int> a; // 定义一个int类型的列表alist<int> a(10); // 定义一个int类型的列表a,并设置初始大小为10list<int> a(10, 1); // 定义一个int类型的列表a,并设置初始大小为10且初始值都为1list<int> b(a); // 定义并用列表a初始化列表bdeque<int> b(a.begin(), ++a ...
C++中数据结构map基础学习
[TOC]
文章参考:http://c.biancheng.net/view/7173.html
概述C++ 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。在一些程序中建立一个 map 可以起到事半功倍的效果,本文为大家总结了 map 的一些基本简单的操作!
构造函数12345// 导入map依赖#include <map> // STL头文件没有扩展名.h// 无参构造函数std::map<int , std::string> mapPerson;
常用方法插入数据12345678// insert 函数插入 pair 数据std::map < int , std::string > mapPerson;mapPerson.insert(pair < int,string > (1,"Jim"));// insert 函数插入 value_type 数据mapPerson.in ...
C++中数据结构tuple基础学习
[TOC]
概述tuple是一个固定大小的不同类型值的集合,是泛化的std::pair。我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了。
C++的迭代器基础学习
[TOC]
概述迭代器是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器,除此之外,STL中迭代器一个最重要的作用就是作为容器与STL算法的粘合剂。
迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器内部必须保存一个与容器相关联的指针,然后重载各种运算操作来遍历,其中最重要的是*运算符与->运算符,以及++、–等可能需要重载的运算符重载。这和C++中的智能指针很像,智能指针也是将一个指针封装,然后通过引用计数或是其他方法完成自动释放内存的功能。
Android之性能监控框架
[TOC]
概述
Android之性能监控框架
[TOC]
概述vector转数组12345678910111213141516171819202122232425262728#include <vector>#include <iostream> using std::vector; int main(void){ //初始化为10个c字符 vector<unsigned char> vec(10, 'c'); unsigned char charray[vec.size()]; //vector全部转到数组 memcpy(charray, &vec[0], vec.size() * sizeof(vec[0])); for(int i = 0; i != sizeof(charray); ++i){ std::cout << charray[i] ; //打印出来观察一下 } std::cout << std::endl; //转部分vect ...