1、面向对象编程的特性
抽象、封装和数据隐藏、多态、继承、代码的可重用性
2、过程性编程
面向过程编程:首先要考虑遵循的步骤,然后考虑如何表示这些数据。并不需要程序一直运行,用户可能希望能够将数据存储在一个文件中,然后从这个文件中读取数据。
面向对象编程:首先考虑数据,不仅考虑如何表示数据,还要考虑如何使用数据。
例子:面向过程–蛋炒饭,一起抄;面向对象–盖饭,配料和饭分开做,做好再盖上去
3、类是用户定义类型的定义,类规范由两个部分组成:
类声明:以数据成员的方式描述数据部分,以成员函数的方式描述共有接口
类方法定义:描述如何实现类成员函数。
4、内联函数
其定义位于类声明中的函数自动成为内联函数,也可以在类声明外定义内联函数,但要加上关键字inline
5、类构造函数
专门用于构造新对象,将值赋给它们的数据成员。构造函数没有返回值,构造函数的参数名不能与类成员的相同
6、析构函数
完成清理操作,一般释放内存
7、this指针,当成员函数涉及到两个对象时,在这种情况下可能需要this指针,this指针指向当前调用对象,指向的是地址
8、类如何实现抽象、封装、和数据隐藏
抽象: 类表示人们可以使用类方法的共有接口对类对象执行的操作
数据隐藏: 类的数据成员是私有的,只能通过成员函数来访问这些数据
封装: 实现的具体细节都是隐藏的
9、默认构造函数是没有参数值或者所有参数值都有默认值的构造函数。拥有默认构造函数后,可以声明对象,而不初始化它。
10、运算符重载是一种形式的c++多态
11、友元函数
通过让函数成为类的友元,可以赋值该函数与类的成员函数相同的权限,即可以访问私有成员。友元函数看作类的扩展接口的组成部分,另外只有类声明决定哪一个函数是友元函数,因此类声明仍然控制了哪些函数可以访问私有数据。没有违反数据隐藏的原则。
12、转换函数用于强制类型转换,必须是类方法,不能指定返回类型,不能有参数
13、复制构造函数:用于将一个对象复制到新创建的对象中
14、默认复制构造函数:将逐个赋值分静态成员,成员赋值也称为浅拷贝。
15、如果类中包含这样的静态成员,即其值将在新对象被创建时发生变化,则应该提供一个显式复制构造函数来处理计数问题
16、显式复制构造函数:也叫深度复制(深拷贝)
浅拷贝复制指针,深拷贝另开辟一块内存空间并将所有数据复制过去
17、类继承
能够从已有的类派生出新的类,而派生类继承了原有类的特征,包括方法。派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问
18、c++有三种继承方式:
19、多态公有继承
同一个方法在派生类和基类中的行为不同。方法的行为应却决于调用方法的对象。
有两种方法可用于实现多态共有继承:
20、虚析构函数:确保释放派生对象时,按正确的顺序调用析构函数(先派生类后基类)。
21、静态联编:在编译过程中进行联编
动态联编:编译器必须生成能够在程序运行时选择正确的虚方法的代码
该过程如何实现?
是通过虚函数表来实现的。含有虚函数的类的对象均会多存储一个4字节的虚函数表地址,默认指向其对象所属类的虚函数表,在程序运行时,通过该指针找到对应虚函数表中的函数,从而实现多态。
22、为什么不摒弃静态联编
因为要考虑效率。并不是所有的派生类都重新定义基类的方法,也不需要动态联编,这种情况下静态联编更合理。
23、构造函数不能是虚函数,这是为了按正确的顺序调用构造函数。
如果构造函数是虚函数,创建派生类对象时,将调用派生类的构造函数,而不是基类的构造函数。然后派生类的构造函数将使用基类的一个构造函数,这种顺序不同于继承机制。
友元函数不能是虚函数,因为虚函数必须是成员函数,友元函数不是成员函数
24、纯虚函数:类声明时函数结尾处为"=0",没有函数体{}
抽象基类:类声明中包含纯虚函数。抽象基类将不能创建对象,只能用作基类。
25、派生类从基类那里继承了什么?
继承了公有成员、保护成员、私有成员,但是私有成员不能直接访问
26、派生类不能从基类继承什么?
不能继承构造函数、析构函数、赋值运算符和友元
27、如果派生类没有添加任何数据成员,它是否需要构造函数?
需要,每个类必须有构造函数
28、在什么情况下,派生类需要定义赋值运算符?
如果派生类构造函数使用new运算符来初始化类的指针成员,则应定义一个赋值运算符。更普遍的说,如果对于派生类成员来说,默认赋值不正确,则应定义赋值运算符。
29、为什么按引用传递对象比按值传递对象的效率高
按引用传递对象,可以确保函数从虚函数收益,另外,按引用传递对象可以节省内存空间。按值传递对象的主要优点在于保护原始数据,但是可以将引用作为const类型传递,也可以保证原始数据不被修改。
30、使用explict关闭隐式转换
31、关键字template$<class T1, class T2, …>$来定义一个模板
函数模板可以重载,只要形参表或类型参数表不同即可
模板的作用:实现代码的可重用性,方便实现几个很相似的函数。实际上在编译时,模板会生成相似但不同的函数(实例化,形参类型替换成实参类型)
函数模板和函数的次序:先找完全匹配的普通函数,在找完全匹配的模板函数,再找自动类型转换后匹配的普通函数。注意:函数模板不进行自动类型转换
32、虚基类的概念
虚基类是为了防止多重继承时,当两条继承类有相同的祖先时,则类中将包含祖先成员的两个拷贝。
参考:https://github.com/Yorkking/SYSU-CS-Postgraduate-Entrance-Examination