-1-面向对象程序设计复习纲要第1111章:(一)C++C++C++C++对CCCC的扩充1、函数原型声明:函数类型函数名(参数表);2、函数的重载:同一函数名定义多个函数,这些函数的参数个数和参数类型不同3、有默认参数的函数:√可以只对一部分形参指定默认值√指定默认值的参数必须放在形参表列中的最右端√实参的个数可以与形参的个数不同,实参未给定的,从形参的默认值得到值。√如果函数的定义在函数调用之前,则应在函数定义中给出默认值√一个函数不能既作为重载函数,又作为有默认参数的函数。4、引用,又称别名。√引用与其所代表的变量共享同一内存单元,编译系统不给它单独分配存储单元√区别声明引用变量还是取地址操作,看其前面有没有类型符,有必然是对引用的声明√对引用的初始化,可以用一个变量名,也可以用另一个引用√引用初始化后不能再重新声明为另一个变量的别名5、内置函数:inline√在编译时将所调用函数的代码直接嵌入到主调函数中√使用内置函数可以节省运行时间,但却增加了目标程序的长度。√内置函数中不能包括复杂的控制语句,如循环语句和switch语句。√只有那些规模较小而又被频繁调用的简单函数,才适合于声明为inline函数。(二)C++程序的编写和实现从C++源程序到可执行程序的步骤:编辑(*.cpp)、编译(*.obj)、链接(*.exe)、执行。第2222章面向对象程序设计概述面向对象系统的特性:1封装性:就是把每个对象的数据和操作包装在一个类中,并尽可能隐藏对象的内部细节。2继承性:是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。3多态性:是指允许不同类的对象对同一消息作出的响应不相同。第3333章类和对象类的封装性和信息隐蔽•通过类来实现封装性,类的作用是把数据和算法封装在用户声明的抽象数据类型中•类的公用接口与私有实现的分离”形成了信息隐蔽。构造函数-2-√构造函数的名字必须与类名同名√在建立对象时自动执行构造函数。√构造函数没有返回值√系统会自动生成一个空的构造函数√构造函数可重载析构函数√析构函数的名字是类名的前面加一个“~”符号√当对象的生命期结束时,会自动执行析构函数。√析构函数不返回任何值,没有函数类型,也没有函数参数。因此它不能被重载。√一个类只能有一个析构函数。拷贝构造函数√是一种特殊的构造函数。功能是将参数代表的对象逐一拷贝到新创建的对象中。其调用由系统自动实现。只有一个参数,这个参数是本类对象的常引用√每个类都必须有一个拷贝构造函数,如果没定义,则系统自动产生一个缺省的。堆对象,是在程序运行时根据需要随时可以被创建或删除的对象。通过new自动调用构造函数创建对象,用delete自动调用析构函数,释放对象。静态成员:staticstaticstaticstatic1111静态数据成员√在内存中只占一份空间。在程序编译时分配空间,到程序结束时才释放空间。√既可以通过对象名引用,也可以通过类名和域运算符“∷”来引用。√只能在类体外进行初始化。如果未赋初值,则编译系统会自动赋予初值0。2222静态成员函数√静态成员函数,在类外调用公用的静态成员函数,要用类名和域运算符“∷”。√没有thisthisthisthis指针。静态成员函数与非静态成员函数的区别:√非静态成员函数有this指针,而静态成员函数没有this指针。√静态成员函数可以直接引用本类中的静态数据成员。√对本类中的非静态成员不能进行默认访问。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。thisthisthisthis指针*指向本类对象的指针*值为当前被调用的成员函数所在的对象的起始地址*静态成员函数没有this指针-3-友元friendfriendfriendfriend,用于不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享1111友元函数√将普通函数声明为友元函数√友元成员函数:声明的时候,要加上成员函数所在的类名和域运算符“∷”。如:friendvoidTime∷display(Date&);2222友元类:friendfriendfriendfriend类名;两点说明:(1)友元的关系是单向的而不是双向的。(2)友元的关系不能传递。第4444章派生类与继承派生类对基类成员的访问权:public保持、private私有、protected保护派生类构造函数的调用顺序::::首先是虚基类构造函数、基类构造函数、子对象构造函数、最后是派生类构造函数注意:各个基类构造函数的执行顺序取决于定义派生类时所指定的各个基类的顺序,而与派生类构造函数的成员初始化列表中给定的基类顺序无关。派生类构造函数使用中应注意的问题1在基类中定义了默认构造函数或者没有定义任何构造函数时,派生类构造函数中省略对其基类构造函数的调用。2当基类的构造函数使用一个或多个参数时,派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。虚基类1.作用:保证多级继承中,间接共同基类时只有一份同名成员。2.虚基类的构造函数(带参数情况)√√√√虚基类所有的直接或间接派生类的构造函数的成员初始化列表中都要列出该虚基类构造函数的调用。√√√√只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数。√√√√虚基类的构造函数先于非虚基类的构造函数的执行。赋值兼容规则:在需要基类对象的任何地方都可以使用公有派生类的对象来替代。赋值兼容规则替代的3种情况:*派生类的对象可以赋值给基类对象*派生类的对象可以初始化基类的引用*派生类对象的地址可以赋给基类类型的指针在替代之后,派生类对象就可以做为基类的对象使用,但只能使用从基类继承的成员第5555章多态性-4-多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。多态性分为静态多态性和动态多态性,静态多态性是通过函数的重载实现的。静态多态性又称编译时的多态性。动态多态性是通过虚函数实现的。又称运行时的多态性。运算符重载1.运算符的重载的形式:类型operator运算符号(参数说明);2.只有以下5种运算符不能重载:.(成员访问运算符).*(成员指针访问运算符)∷(域运算符)sizeof(长度运算符)?:(条件运算符)。3.运算符重载遵循着“四个不变”的原则:①优先级不变②结合性不变③操作数个数不变④语法结构不变4.两种运算符重载方式的比较:重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置“++”、“--”除外)重载为类的友员函数时,参数个数与原操作数个数相同。类型转换����转换构造函数:是将一个其他类型的数据转换成一个类的对象。使用转换构造函数将一个指定的数据转换为类对象的方法如下:(1)先声明一个类。(2)在这个类中定义一个只有一个参数的构造函数,参数的类型是需要转换的类型,在函数体中指定转换的方法。类名((((其他数据类型变量名){){){){函数体}}}}(3)在该类的作用域内可以用以下形式进行类型转换:类名((((指定类型的数据))))就可以将指定类型的数据转换为此类的对象。����类类型转换函数:是将一个类的对象转换成另一类型的数据。类型转换函数的一般形式为:operatoroperatoroperatoroperator类型名((((){){){){实现转换的语句}}}}虚函数1.1.1.1.使用方法(1)在基类用virtual声明成员函数为虚函数。在类外定义虚函数时,不必再加virtual。(2)在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。(3)定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。(4)通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。2.2.2.2.纯虚函数::::在声明虚函数时被“初始化”为0的虚函数。virtualvirtualvirtualvirtual函数类型函数名((((参数表列))))=0;=0;=0;=0;-5-√√√√纯虚函数没有函数体√√√√纯虚函数只有函数名而不具备函数的功能,不能被调用。√√√√纯虚函数的作用是在基类中为其派生类保留一个函数的名字。√√√√如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数。3.3.3.3.虚析构函数:将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚函数。•虚析构函数能保证在撤销动态分配空间时能得到正确的处理。•构造函数不能声明为虚函数。抽象类:包含纯虚函数的类√√√√抽象类不能定义对象,但是可以定义指向抽象类数据的指针变量。当派生类成为具体类之后,就可以用这种指针指向派生类对象,然后通过该指针调用虚函数,实现多态性的操作。√√√√抽象类的作用是作为一个类族的共同基类,或者说,为一个类族提供一个公共接口。√√√√如果在抽象类所派生出的新类中对基类的所有纯虚函数进行了定义,那么这些函数就被赋予了功能,可以被调用。这个派生类就不是抽象类,而是可以用来定义对象的具体类。第6666章模板类是对象的抽象,而模板又是类的抽象,也就用模板能定义出具体类模板分为函数模板和类模板。函数模板:templatetypenameT,classP√只适用于函数的参数个数相同而类型不同,且函数体相同的情况。√函数模板的参数个数至少一个。标准模板库(STL)的代码分为三类:算法、容器、迭代器。第7777章C++C++C++C++的I/OI/OI/OI/O流头文件:基本输入输出:istream文件输入输出:fstream的重载:ostream&operator(ostream&out,自定义类&obj);的重载:istream&operator(istream&in,自定义类&obj);====================================================================================题型:一、单项选择题(2*10(2*10(2*10(2*10,共20202020分))))二、多项选择题(2*5(2*5(2*5(2*5,共10101010分))))三、填空题(2*102*102*102*10,共20202020分)四、程序分析题(5*4(5*4(5*4(5*4,共20202020分))))五、完成程序题(5*3(5*3(5*3(5*3,共15151515分))))(完整程序去掉两行,补充完整)六、编程题((((本大题共2222小题,第一题5555分,第二题10101010分,共15151515分))))具体题型样式,参考课件中的练习内容。====================================================================================-6-四、五部分侧重考核知识点:�多继承下构造函数/析构函数的调用顺序�继承机制下构造函数的重载�虚函数�友元及静态成员�类的声明和对象的定义(包括成员函数的类内和类外定义等)�运算符重载====================================================================================【例】多继承下构造函数////析构函数的调用顺序includeiostream.hclassA{public:A(){coutA.....endl;}~A(){coutdel...Aendl;}};classB{public:B(){coutB.....endl;}~B(){coutdel...Bendl;}};classC:publicA,v