1.面向对象
面向过程:以过程为中心,将程序抽象成数据和对数据的操作。
面向对象:以对象(类)为中心,将程序抽象成对象之间的操作
1.1 封装、继承、多态
封装:代码模块化;
继承:代码重用;
多态:接口重用。
1.2 重载和重写
重载:不同的函数使用相同的函数名,但是参数个数或者类型不同
重写:派生类中对基类的虚函数重新实现,即函数名和参数都一样,但是实现体不一样
1.3 深拷贝和浅拷贝
浅拷贝:值拷贝,指向同一块内存空间,(默认构造函数和默认的赋值运算符重载函数)
深拷贝:拷贝相应的内存,不会出现重复释放同一块内存的现象
1.4 多态:静态多态和动态多态
静态多态有函数重载、运算符重载、泛型编程等,(重载和模板)
动态多态是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。当父类指针(引用)指向 父类对象时,就调用父类中定义的虚函数;即当父类指针(引用)指向 子类对象时,就调用子类中定义的虚函数(虚函数和继承)
1. 动态多态行为的表现效果为:同样的调用语句在实际运行时有多种不同的表现形态。
2. 实现动态多态的条件: - 要有继承关系 - 要有虚函数重写(被 virtual 声明的函数叫虚函数) - 要有父类指针(父类引用)指向子类对象
3. 动态多态的实现原理 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储类虚函数指针的数据结构, 虚函数表是由编译器自动生成与维护的。virtual 成员函数会被编译器放入虚函数表中,存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr 指针)。在多态调用时, vptr 指针就会根据这个对象在对应类的虚函数表中查找被调用的函数,从而找到函数的入口地址(使用虚函数需要额外的内存和执行速度的成本)
1.5 拷贝构造和赋值构造
拷贝构造时机:用一个对象初始化另一个对象,对象以值传递的方式传递给函数参数,函数局部对象以值传递的方式从函数返回
赋值操作:将一个对象赋值给另一个对象
1.6 类如何不能实例化
1. 抽象类(纯虚函数)
2. 构造函数声明为private(单例模式)
1.7 多继承的二义性
1. 利用作用域::;
2. 派生类定义同名成员,