Linux嵌入式开发学习 c++:day5

  【私有继承】
基类的public成员和protected成员被继承后作为派生类的私有成员。
默认的继承是私有继承。
为了保证基类的部分外部接口特征能够在派生类中也存在,就必须在派生类中国重新定义同名的成员函数(重载)。
【保护继承】
基类的public和protected成员都以保护成员的身份出现在派生类中。
保护级别的成员,除了自己的类内可以访问以外,其派生类也可以访问。
【多态】
首先来看面向对象(OOP)的三大特征:
封装wrap:实现细节隐藏,使得代码模块化。把成员数据和成员函数封装起来,通过公共的成员接口进行成员数据的操作。
继承inheritance:扩展已存在的代码,目的是为了代码重用
多态polymorphism:目的是为了接口重用。也就是说,不论传递过来的究竟是哪个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。
多态(Polymorphism)按字面的意思就是“多种状态”,简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,是面向对象编程领域的核心概念。
多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。
【如何实现多态?】
多态是通过虚函数来实现的。
在继承中,如果基类和派生类定义了同名的成员函数,当用基类的指针(或引用)指向公有派生类的对象时,我们希望可以访问派生类的成员函数,但是却只能访问从基类继承来的成员函数,不能直接访问派生类中的成员函数。
解决办法:
    1)将基类指针(引用)显示类型转换成派生类指针(引用)来实现
    2)通过虚函数来实现(常用)
    
【虚函数和多态】
虚函数(virtual function)
有时候,希望派生类和基类有相同的方法,但是行为却有所不同,这就是多态。这里就引入了虚函数的概念。
简单地说,用virtual修饰的成员函数,就是虚函数。虚函数的作用就是实现多态性(Polymorphism)。
    虚函数的格式:
        virtual  返回值类型  函数名  (参数表){}
虚函数的限制如下:
A、非类的成员函数不能定义为虚函数
B、类的静态成员函数不能定义为虚函数
C、构造函数不能定义为虚函数,但可以将析构函数定义为虚函数
D、只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
E、虚函数具有传递性,当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数(函数名相同、参数列表完全一致、返回值类型相关)自动成为虚函数。
Linux嵌入式开发学习 c++:day5_第1张图片
【多态的条件】
1.要有继承
2.派生类中要有函数的覆盖
3.基类被覆盖的函数要声明为虚函数
4.基类引用/指针 要指向派生类对象
【抽象类】
有纯虚函数 -> 抽象类 -> 无法实例化
可以实例化 -> 不是抽象类 -> 无纯虚函数
如果基类只表达一些抽象的概念,并不与具体的对象相联系,但它又必须为它的派生类提供一个公共的框架,就需要用到抽象类。
可以将基类中的虚函数定义成纯虚函数,纯虚函数是一种没有具体实现的特殊的虚函数。
虚函数的语法格式如下:
virtual   返回值类型   函数名(参数列表) = 0;
抽象类至少有一个纯虚函数。
【抽象类性质】
抽象类只能作为基类来派生新类,不能对其进行实例化。
抽象类不能用做参数类型、函数返回值类型、显式转换类型。
从抽象类派生的类必须提供纯虚函数的实现,否则此派生类中仍然将它声明为纯虚函数,那么该派生类也是抽象类。
抽象类同样支持多态。
【容器类型】
容器用来存储数据的集合,数据可以是用户自定义类型,也可以是预定义类型。
C++中有两种类型的容器:顺序容器和关联容器。
容器类自动申请和释放内存,无需new和delete操作。
【顺序容器】
是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。
顺序性容器中的每个元素均有固定的位置,除非用删除或者插入的操作改变这个位置。
顺序容器的元素排列次序与元素值无关,而是由元素添加到容器的次序决定。
顺序容器包括:vector(向量)、list(列表)、deque(队列)
【顺序容器vector(向量)】
使用需要导入头文件#include
vector和数组类似,能高效地进行随机存取,是最常用的一种顺序容器。
vector定义与初始化如下:
   vector vec1;  //空的向量对象
    vector vec2(5); //包含5个0的元素
    //以vec2作为数据来源拷贝构造
    vector vec3(vec2);
    vector vec4(5,123); //包含5个123元素
【顺序容器list(列表)】
使用需要导入头文件#include
list由双向链表实现,内存空间不是连续的,因此只能通过指针访问数据,能高效的进行插入和删除操作。
list定义和初始化如下:
    //一个内容为空的列表
    list vec1;
    //5个空字符串的元素
    list vec2(5);
    //初始内容是5个“Jerry”元素
    list vec3(5,"Jerry");
    //拷贝构造函数
    list lis(vec3);
list只能只用指针来进行读写操作,因此非常依赖于迭代器。常用函数如下:
empty()                判断是否为空,同vector
push_back(“bye”);         //末尾追加元素“bye”,同vector
push_front("hi");             //开头追加元素"hi“
list1.insert(--list1.end(), “ok”);    //在倒数第二的位置插入数据
list1.pop_back();             //删除最后的元素,同vector
list1.pop_front();            //删除最开始的元素
list1.erase(++list1.begin());        //删除第二个元素
list1.front()            //第一个元素的引用
list1.back()            //最后一个元素的引用
list1.sort();            //排序
list1.clear();             //清空    
list1.size();            //获取大小
迭代器指针可调用advance(迭代器对象,向后移动数)的方式获取固定位置的指针
【顺序容器 deque(队列)】
基本等同于vector,但是支持从开始端操作。
使用时需要导入头文件#include
优点在于兼顾vector和list,算是一种比较均衡的顺序容器。
【顺序容器对比】
如果追求高效的随机存取,不在乎插入和删除的效率,使用vector
如果需要大量的插入和删除操作,不在乎随机存取的效率,使用list
如果想在上述两者之间取一个均衡的性能,或重点使用两端存取,使用deque
随机存取:没有固定位置的存取数据
两端存取:仅仅在首尾两端进行存取
【关联容器】
各元素没有严格的物理上的顺序关系,即元素在容器中没有保存元素置入容器时的逻辑顺序。
但是在内部仍然有排序特点,因此可以使用迭代器进行遍历等。
常见关联容器:map(键值对映射)、multimap(多重键值对映射)等。
以键值对的形式存在(key/value)
map与multimap的区别仅仅在于允许一个键对应一个/多个值,map更为常用。
使用需要包含头文件#include
键(key)有唯一性,元素默认按照键进行升序排列
通常使用具体的键来获得对应的值。
【迭代器】
容器的遍历通常都是使用迭代器进行的,C++标准库为每一种容器提供了对应的迭代器类型。
迭代器如同一个指针,但是迭代器又不仅仅是指针。
迭代器的定义格式为:
    容器类型<元素类型>::iterator iter;
例如:
    vector::iterator iter;
Linux嵌入式开发学习 c++:day5_第2张图片
每种容器都定义了特殊的函数,用于返回所需类型的迭代器,通常情况下使用begin函数获得顺序迭代器类型。
另外,还有const interator类型,表示只读。
【异常】
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
异常提供了一种转移程序控制权的方式。
程序一旦出现异常没有经过正确的处理,就会造成程序运行的崩溃。
处理异常的方式有两种:捕获异常(try-catch)和抛出异常(throw)
【throw 抛出异常】
您可以使用 throw 语句在代码块中的任何地方抛出异常。
throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。
抛出的异常是抛出到函数调用的上一级
【try...catch... 捕获异常】
如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。
try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。
【异常注意事项】
抛出标准异常的时候要给构造函数传入字符串作为what的输出内容。
出现的异常类型必须跟捕获的异常类型相同。
如果捕获的类型不匹配,程序仍然会终止。
可以使用…来表示捕获所有的异常类型。
可以使用多重catch来捕获不同的类型,此时捕获的顺序为派生类异常优先。
C++的异常处理机制不完善,在很多情况下不推荐使用。
【IO】
C++ 标准库提供了一组丰富的输入/输出功能。
C++ 的 I/O 发生在流中,流是字节序列。
如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。
如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。

你可能感兴趣的:(qt,c++)