第八章
1.重载运算符的组成:关键字operator和其后要定义的运算符。也包含返回类型(运算结果的类型)、参数表(提供参与运算的操作数)以及函数体(进行运算,返回运算结果)。
2.运算符函数的参数个数取决于运算符操作数的个数和运算符函数是成员函数还是非成员函数。非成员运算符函数通常成声明为类的友元,以便访问私有数据成员。
3.除重载的函数调用运算符operator()之外,其他运算符函数不能有默认实参。
4.运算符函数只有在类类型的对象参与运算时才起作用。
5.重载运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数。
6.返回类型的判断:逻辑运算符和关系运算符应返回bool值,算术运算符应返回操作数类型的值,赋值运算符和复合赋值运算符返回左操作数对象的引用。
7.具有对称性的运算符可能转换两个操作数中的任何一个,如算术、关系和位运算符等,通常为非成员函数。重载移位运算符<<和>>用于对象的I/O操作时,左操作数是标准库流对象,右操作数才是类类型的对象,只能用非成员函数。重载自增自减运算符,一般应同时定义前缀和后缀形式。赋值运算符operator=只能用成员函数重载。所有赋值运算符均改变左值
第九章
1.在函数后面加const限定,为常函数,只读不写。
2.派生类同样可以再次被继承,构成的层次结构为继承层次。
3.继承的语法形式:
class 派生类名字:【访问限定符】基类名字
{
数据成员或成员函数声明;
};
4.派生类成员的访问控制:
对于其派生类来讲,protected成员和public成员是可以访问的,但对其他类和函数而言,protected成员不能访问;派生类不能访问基类的private私有数据成员。
5. 公有继承与私有继承的区别:二者相同的地方是基类的私有数据成员都不能被访问,不同之处在于派生类对基类的继承方式,公有继承派生类中的基类是可以访问的,私有继承派生类中基类为私有不能被访问。
6. 在派生类中重新定义基类中的同名成员之后,原来基类中的名字在派生类中被隐藏。
7. 重定义的方式:①覆盖:在派生类中重定义基类接口中的成员函数,参数表和返回类型保持与基类中一致。②隐藏:在派生类中重定义基类接口中的成员函数,并改变了函数的参数表或返回类型。
8. 派生类的生成过程经历三个步骤:①吸收基类成员(构造、析构除外)②改造基类成员(隐
藏或覆盖)③添加派生类新成员
9.对基类中的成员进行初始化:创建派生类对象时用指定参数调用基类构造函数来初始化。
10.派生类构造函数和析构函数的使用原则:
①基类中的构造函数和析构函数不能被继承。
②若基类中没有定义构造函数或有无参的构造函数,派生类也可以不用定义构造函数。
③如果基类无无参的构造函数,派生类必须定义构造函数。
④如果派生类的基类是派生类,则每个派生类只负责直接基类的构造。
11.多重继承:一个派生类直接继承多个基类。语法形式如下:
class 派生类名:访问限定符 基类1,访问限定符 基类2,…
{数据成员和成员函数声明};
12.多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。
13.派生类析构函数(1)当派生类中不含对象成员时
①在创建派生类对象时,构造函数的执行顺序是:基类的构造函数→派生类的构造函数;
②在撤消派生类对象时,析构函数的执行顺序是:派生类的析构函数→基类的析构函数。
(2)当派生类中含有对象成员时
①在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
②在撤消派生类对象时,析构函数的执行顺序:派生类的析构函数→对象成员的析构函数→基类的析构函数。
(3)多继承:先执行所有基类的构造函数,再执行对象成员的构造函数,最后执行派生类的构造函数。
14.赋值兼容规则:程序中需要使用基类对象的任何地方,都可以用公有派生类的对象来替代。可以利用该规则让派生类的对象赋值给基类对象(强制类型转换),可以初始化基类的引用,派生类对象地址可赋给基类类型的指针。
15.赋值兼容规则注意事项:①声明为指向基类的指针可以指向它的公有派生类的对象,但不允许指向它的私有派生类的对象。②允许将一个声明为指向基类的指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象的指针指向其基类的一个对象。③声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从基类继承来的成员,而不能直接访问公有派生类的定义的成员。
16.创建包含对象成员的组合对象时会引起成员类构造函数的调用。撤销一个组合对象时,其成员类的析构函数也会被调用。
17.创建派生类对象时会引起基类构造函数的调用。撤销一个派生类对象时,基类的析构函数也会被调用。
第十章
1.利用动态绑定实现程序的多态性—同样的消息发送给不同派生类对象时执行不同的操作。实现方法:在用基类的指针或引用调用虚函数时。动态绑定只对虚函数起作用,只有在使用含有虚函数的基类地址调用时发生。
2.对于基类希望派生类覆盖的函数,将基类定义为虚函数,当使用指针或引用调用虚函数时,该调用会被动态绑定。
3.虚函数语法形式:virtual 返回类型 成员函数名(参数名);
4.virtual只能在类内成员函数声明之前,不能用于类外的函数定义。
5.所有虚函数都必须有定义,不管是否被调用到。只有非静态成员函数可以声明为虚函数。虚函数可以是另一个类的友元。
6.为保持虚函数的多态性,在派生类中覆盖基类的虚函数时要用相同的参数表和返回类型。可用override标记派生类中的虚函数。当基类的虚函数返回的类型是基类本身的指针或引用时,派生类中重写的虚函数可以返回派生类的指针或引用,仍被认为是覆盖的虚函数。
7.虚函数机制在构造函数和虚构函数中不起作用,构造函数不能是虚函数,析构函数可以是虚函数。析构函数最好声明为虚函数,若声明之后,派生类的析构函数也一定为虚函数。虚函数必须是所在类的成员函数,不能是友元函数或静态函数。
8.只有通过基类的指针或引用才能实现虚函数的多态调用,通过对象调用虚函数不会有多态性。
9.抽象类:至少包含一个纯虚函数的类。
其语法形式:virtual 返回类型 函数名(参数表)=0;
纯抽象类:该抽象类中所有成员函数都是纯虚函数。
纯虚函数:在基类中说明的虚函数,在基类中没有定义
10.继承抽象类时,要在派生类中实现覆盖所有的纯虚函数,否则派生类也会被看成一个抽象类。抽象类中可以包含普通成员函数,在普通成员函数中可以调用纯虚函数。
c++重载,继承,多态知识点总结
最新推荐文章于 2022-11-15 20:06:19 发布