CPP程序设计进阶篇笔记(主要还是ppt的截图)Orz
继承的基本概念及语法
既能用继承,又能用组合,优先选用组合,会比较方便
派生类的构成
继承方式:
公有继承,私有继承,保护继承
被继承的保护成员在派生类内相当于公有成员,可以直接访问,但是在类外不可。
总而言之,这些不同的继承方式影响的是原来类成员的在派生类中的身份问题,这些影响不会出现在当前派生类,会影响到派生类的派生类。
基类和派生类的类型转换:仅限于public公有继承
派生类的构造函数
多继承时,构造函数的构造顺序是取决于继承的顺序
派生类的复制构造函数
派生类对象可以充当基类对象,的引用可以用来初始化基类对象的引用。
派生类的析构函数
析构的顺序与构造顺序相反
访问从基类继承的成员
当基类派生类成员同名时
不同基类的二义性问题
多继承时的二义性
虚基类(解决冗余问题)
相当于在其派生类里创建了指针,而在最远派生类直接继承
类的多态性
操作接口具有表现不同形态的能力,不同环境下对不同对象有不同处理方式,通过绑定实现,绑定就是将一个标识符名称和一段代码结合起来——举例:函数调用表达式与函数体结合。编译时的绑定,早绑定。运行时的绑定,晚绑定。
运算符重载规则:
双目运算符重载为成员函数
该括号里面的形参为双目运算符的第二个参数,因为第一个参数默认为成员类的
单目运算符重载为成员函数:
上述例子表明,前置++运算符返回的是引用,可以作为左值,后置++,返回的临时无名对象的内容,只能作为右值
运算符重载为非成员函数:
1.当第一个操作数(左操作数)为非该类对象时
2.当使用的不是自己设计的类对象
虚函数
若基类函数为虚函数,派生类重载函数则默认为virtual类型,不管加不加virtual,为了可读性,一般加上。
虚析构函数:
在上例中,new函数在构造derive对象时候,只会调用构造函数,不会调用析构函数(当用new来创建对象时,其析构函数不会自动调用,只能通过delete来释放内存。),所以此时应当把析构函数命名为虚函数
公有继承的所有的派生类都是从基类继承的,编译器会认为它们类型都是一样的。
派生类析构函数调用之后,会紧接着调用基类的析构函数。
虚表与动态绑定——虚函数的实现方法:
抽象类:
只要含有纯虚函数的是抽象类,不能定义该类的对象(不能实例化)但可以被继承,可以用指针指向它。
override与final:
多态是指同样的消息作用于不同的对象会产生不同的行为。运算符重载是静态多态性的,是一种扩充语言的机制,而不是改变语言的机制。
动态多态性是通过虚函数来实现的,派生类对象可以初始化基类的引用,派生类的对象地址,可以赋值给基类的指针。
如果想要通过基类指针和引用访问派生类的对象的成员,就要使用虚函数。因为虚函数才有动态绑定的功能,生成了虚表,里面包含了对应的函数,通过基类指针可以访问不同类的同名函数。
PS:虚基类解决的是类成员标识二义性和信息冗余的问题,而虚函数是实现动态多态性的基础。
函数模板:
typename在这里和class没有区别
并不是随意定模板,若模板参数表是自定义类型,则应该重载相关运算符使该类型能参与运算,,否则会出错。
类模板:
线性群体:
数组类模板:
如何封装一个动态数组类
为什么有的函数返回值是引用
指针转换运算符的作用:
数组类应用举例:
STL简介
使用容器要包含相应的头文件
transform算法作用:通过循环遍历队列
迭代器:
容器的基本功能和分类:
从迭代器的访问方式和容器中数据组织方式可分为以下两种
顺序容器的基本功能:
顺序容器的通用接口函数:
顺序容器的特征:
顺序容器的插入迭代器与适配器:
关联容器的分类和基本功能:
函数对象:
函数适配器:
STL算法:
IO流的概念和流类库的结构:
流是信息的一种流动。
键盘和显示器都是一种“文件对象”
输出流概述:
文件流内部有一个指针,默认指向文件写入下一个数据的地址
fixed表示定点形式,scientific表示科学计数法形式
向二进制文件输出:
当不需要对外显示阅读,只需要在文件之间传递数据时,只需要传递二进制信息即可,这样传输效率比较高。
C++中不支持对象的序列化,即将类的对象整体存盘。
向字符串输出:
将内存中的一个字符串当作输出的目的地
输入流概述:
cin相当于输入流类里已经定义好的对象
EOF表示文件结束符,windows中是ctrl+z
从字符串输入:
输入输出流:
异常处理的思想与程序实现:
抛出之后,try函数括号后面的异常程序均不执行。
异常接口声明可以使程序可读性变好。
异常处理中的析构与构造:
自动析构发生在throw之后,在catch之前
标准程序库异常处理:
详细了解要参考cpp类库说明。