版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计C+主要知识点整理面向对象程序设计C+(3)多继承的声明:多继承的声明语法为:class 派生类名:继承方式基类名1,继承方式基类名n (派生类成员声明; ;例:声明一个从基类Basel、Base2派生而来的MultiDerived类 class Basel ;class Base2 );class MultiDerived:public Basel,private Base2 . ;(4)类族:下列图是一个单继承的多类族I A类13.类的继承方式下表第一行的访问属性是成员在基类中的访问属性,其它的访问属性表示基类成员在派 生类中的访问属性。PublicProtectedPri
2、vatePublicPublicProtectedPrivateProtectedProtectedProtectedPrivatePrivatePrivatePrivatePrivate对于类的外部程序,protected成员和private成员一样不可访问。派生类可访问基类的protected和public成员,但不可访问基类的private成员(1)公有继承/EX7_l.cpp :演示vehicle(汽车)公有派生car(小汽车)类#include class vehicle/基类 vehicle 类的声明 private:私有数据成员int wheels ;面向对象程序设计C+prot
3、ected:保护数据成员float weight;public:公有函数成员vehicle( int in_wheels , float in_weight) wheels = in_wheels ; weight=in_weight; int get_wheels() return wheels ; float get_weight() return weight; );class carpublic vehicle派生类 car 类的声明(private:新增私有数据成员int passenger_load ;载客量public:新增公有函数成员car( int in_wheels , f
4、loat in_weight, int people=5 ):vehicle( in_wheels , in_weight) passenger_load=people ; int get_passengers() return passenger_load ; );void main() car bluebird( 4, 1000 );声明 car 类的对象coutnThe message ofbluebird(wheels,weight,passengers):11endlbluebird.get_wheels( ) H 输出小汽车的信息 bluebird.get_weight( )n,n
5、bluebird.get_passengers() endl;)程序运行结果为:The message of bluebird ( wheels, weight, passengers ): 4, 1000, 5(2)保护继承如采用保护继承方式,EX7_l.cpp中派生类car的声明修改如下:class car:protected vehicle 保护派生 car 类的声明(private:int passenger_load ;public:car( int in_wheels, float in_weight, int people=5 ) :vehicle( in_wheels, in_
6、weight) passenger_load = people ; int get_wheels()重新定义 get_wheels() return vehicle:get_wheels(); float gct_wcight() 重新定义 gct_ wcight() return weight; int get_passengers() return passenger_load ; );(3)私有继承private继承时,基类的public和protected成员在派生类中成为私有成员,基类的private面向对象程序设计C+成员在派生类中不可访问,因此私有继承后派生类的成员可以归纳为以下
7、四种:(1)不可访问的成员;基类中的私有成员(2)私有成员;基类中的其他成员和派生类的私有成员(3)保护成员;派生类自己的成员(4)公有成员。派生类自己的成员再进一步派生,所有的基类成员都变成不可访问,相当于终止了基类功能的继续派生。 因此,一般情况下私有继承比拟少用。.类型兼容规那么一个公有派生类的对象在使用上可以被当作基类的对象,反之那么禁止。具体表现在:L派生类的对象可以被赋值给基类对象。.派生类的对象可以初始化基类的引用。.指向基类的指针也可以指向派生类。通过基类对象名、指针只能使用从基类继承的成员.派生类的构造函数和析构函数(1)构造函数当一个派生类同时有多个基类时,构造函数的成员初
8、始化列表要显式写出所有需要给 予参数进行初始化的基类和内嵌对象。派生类构造函数声明的一般语法形式:v派生类名:v派生类名(参数总表):基类名1(参数表1),,基类名n(参数表n),内嵌对象名1(内嵌对象参数表1),,内嵌对象名m(内嵌对象参数表m)(派生类新增成员的初始化语句;其中内嵌对象是指派生类中新增的其他类对象成员。派生类构造函数的执行顺序一般是先祖先(基类),再客人(内嵌对象),后自己(派 生类)。(2)析构函数派生类析构函数的定义方法与没有继承时相同,执行顺序与构造函数相反,是先自己(派 生类),再客人(内嵌对象),后祖先(基类)。.小结(1)继承时的构造函数L基类的构造函数不被继承
9、,派生类中需要声明自己的构造函数。.声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始 化,自动调用基类构造函数完成。.派生类的构造函数需要给基类的构造函数传递参数(2)构造函数的调用次序.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。.调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。.派生类的构造函数体中的内容。(3)拷贝构造函数假设建立派生类对象时调用缺省拷贝构造函数,那么编译器将自动调用基类的缺省拷贝构 造函数。假设编写派生类的拷贝构造函数,那么需要为基类相应的拷贝构造函数传递参数。例如: C:C(C &cl):B(cl)10面向对象
10、程序设计C+(4)同名隐藏规那么当派生类与基类中有相同成员时:假设未强行指名,那么通过派生类对象使用的是派生类中的同名成员。如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定。.派生中成员的标识与访问(1)作用域分辨符作用域分辨符“:“用来限定要访问的成员归属哪个类:v类名:成员名类名:成员名(参数表)(2)多继承中作用域分辨符的使用多继承派生类从直接基类的共同上一级基类公有继承来的非私有成员拥有相同的名称, 需用作用域分辨符来区分。.虚基类作用:解决多继承时可能发生的对同一基类继承屡次而产生的二义性问题.为最远的派生类提供唯一的基类成员,而不重复产生屡次拷贝注意:在第一级继承时就
11、要将共同基类设计为虚基类。虚基类技术使从不同路径继承过来的同名成员在内存中只有一个拷贝,同一个函数名只 有一个映射。(1)虚基类的声明虚基类的声明形式为:class派生类:virtual 继承方式基类名在多继承情况下,虚基类关键字virtual只对紧跟其后的基类起作用。声明了虚基类之 后,虚基类的成员在进一步派生过程中和派生类一起维护同一个内存数据拷贝。(2)虚基类及其派生类的构造函数建立对象时所指定的类称为最(远)派生类。虚基类的成员是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成 员初始化表中给出对虚基类的
12、构造函数的调用。如果未列出,那么表示调用该虚基类的缺 省构造函数。在建立对象时,只有最派生类的构造函数调用虚基类的构造函数,该派生类的其它 基类对虚基类构造函数的调用被忽略。.对象指针(1)对象指针的定义对象指针亦称为类的指针变量,用于保存该类对象在内存中存储空间的首地址。声明一 个类的指针变量的语法如下:类名*指针变量名;用对象指针访问该对象中的成员,用法与结构体变量的指针相似,既可以使用“*”运算 符,也可以使用运算符。例如:CStudcnt Stul;CStudent *pStu=&Stul;pStu.SetlD; 访问类 CStudent 的数据成员 SetIDpStu-SetDisp
13、l(“张建华”);访问类 CStudent 的成员函数 SetDispl()(2)引入派生类后的对象指针使用引入派生类之后的对象指针时要特别注意下面几点:11面向对象程序设计C+(1) 一个声明指向基类对象的指针可以指向它的公有派生类对象,但不能指向它的私有 派生类对象。(2)声明为指向基类对象的指针,当其指向它的公有派生类对象时,只能利用它来直接 访问派生类中从基类继承来的成员,不能直接访问公有派生类中特定的成员。(3)不能将一个声明为指向派生类对象的指针指向其基类的对象。赋值兼容原那么:公有派生类继承来的成员可以作为基类的成员使用。(1)派生类从基类继承的成员地址可以赋给指向基类的指针;(
14、2)派生类从基类继承的成员可以赋值基类成员;(3)可用派生类从基类继承的成员初始化基类的引用。五、多态性.多态性的概念多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的 对象接收时有可能导致完全不同的行为。.运算符重载(1)运算符重载的规那么.只能重载C+中已有的运算符,不能臆造新的运算符;.类属关系运算符作用域分辨符,:、成员指针运算符“*、sizeof运算符和三目 运算符“?: ”不能重载。.重载之后运算符的优先级和结合性都不能改变,单目运算符只能重载为单目运算符, 双目运算符只能重载为双目运算符。.运算符重载后的功能应当与原有功能相类似。.重载运算符含义必须清楚
15、,不能有二义性。运算符的重载形式有两种:(1)重载为类的成员函数;(2)重载为类的友元函数。运算符重载为类的友元函数的一般语法形式为:friend 函数类型,operator 运算符(形参表)(函数体;)其中:(1)函数类型:重载运算符的返回值类型,即运算结果类型;(2) operator:定义运算符重载函数的关键字。(3)运算符:要重载的运算符名称。(4)形参表:给出对象和类型。friend:运算符重载为友元函数时的关键字。(2)运算符重载为成员函数.双目运算:oprdl B oprd2把B重载为oprdl所属类的成员函数,只有一个形参,形参的类型是oprd2所属类。例 如,经过重载之后,表
16、达式oprdl+oprd2就相当于函数调用oprdl. operator +(oprd2) o.单目运算12面向对象程序设计C+1)前置单目运算:Uoprd把U重载为oprd所属类的成员函数,没有形参。例如,“+”重载的语法形式为:函 数类型,operator +();+ oprd就相当于函数调用oprd.operator +();2)后置单目运算oprdV运算符V重载为oprd所属类的成员函数,带有一个整型(int)形参。例如,后置单目运 算符重载的语法形式为:函数类型,operator - (int);oprd-就相当于函数调用oprd.operator (。);(3)运算符重载为友元函数
17、.双目运算:oprdl B oprd2双目运算符B重载为oprdl所属类的友元函数,该函数有两个形参,表达式oprdl B oprd2 就相当于函数调用operator B (oprdl, oprd2)o.单目运算1)前置单目运算Uoprd前置单目运算符U重载为oprd所属类的友元函数,表达式U oprd相当于函数调用 operator U(oprd)o2)后置单目运算oprdV后置单目运算符V重载为oprd所属类的友元函数,表达式oprd V相当于函数调用 operator V(oprd, int)。.虚函数(1)虚函数的定义虚函数的定义语法是:virtual 函数类型函数名(形参表)(函数
18、体)虚函数与重载的关系:在派生类中重载一个虚函数,要求函数名、返回类型、参数个数、参数类型以及参数的 顺序都与基类中原型完全相同,不能有任何的不同。而一般的函数重载,只要函数名相 同即可,函数的返回类型及所带的参数可以不同。(2)虚函数的限制设置虚函数须注意:(1)只有成员函数才能声明为虚函数。因为虚函数仅适用于有继承关系的类对象,所以 普通函数不能声明为虚函数。(2)虚函数必须是非静态成员函数。这是因为静态成员函数不受限于某个对象。(3)内联函数不能声明为虚函数。因为内联函数不能在运行中动态确定其位置。(4)构造函数不能声明为虚函数。多态是指不同的对象对同一消息有不同的行为特性。虚函数作为运
19、行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之 前运行的,因此,虚构造函数是没有意义的。(5)析构函数可以声明为虚函数。析构函数的功能是在该类对象消亡之前进行一些必要 的清理工作,析构函数没有类型,也没有参数,和普通成员函数相比,虚析构函数情 况略为简单些。虚析构函数的声明语法为:virtual类名13面向对象程序设计C+例如:class B(public: virtual -B(););(3)纯虚函数纯虚函数是一个在基类中没有定义具体操作内容的虚函数,要求各派生类根据实际需要 定义自己的实现内容。纯虚函数的声明形式为:virtual 函数类型,(参数表)=0纯虚函数与一般虚函
20、数成员的原型在书写形式上的不同就在于后面加了“=0”,说明在基 类中不用定义该函数,它的实现局部(函数体)留给派生类去做。(4)抽象类抽象类的主要作用是通过它为一个类道建立一个邦的接口,使它们能够更有效地发挥 多态特性。一个抽象类至少带有一个纯虚函数。使用抽象类时需注意以下几点:(1)抽象类只能用作其他类的基类,不能建立抽象类对象。抽象类处于继承层次结构的 较上层,一个抽象类自身无法实例化,只能通过继承机制,生成抽象类的非抽象派生类, 然后再实例化。(2)抽象类不能用作参数类型、函数返回值或显式转换的类型。(3)可以声明一个抽象类的指针和引用。六、群体类和群体数据的组织.函数模板声明方法:te
21、mplate typename 标识符)函数声明.类模板类模板用于设计一个通用类,使这个类的数据成员的类型、成员函数的参数能够按照需 要进行改变(即参数化)声明类模板的一般形式为:template class class_name()其中,Ttype是一个标识符,代表所声明的类模板中参数化的类型名。注意:模板类的 成员函数必须是函数模板。定义了类模板以后,就可以创立这个类的实例: Class_name 对象 1,,对象 n;type用具体的数据类型代入,系统根据代入的数据类型生成所需的类,并创立该类的对 象。. string 类string类的定义和初始化形式1: string对象名(“字符串
22、”)口表示可选项或string对象名匚”字符串”口表示可选项14面向对象程序设计C+形式2:(生成由n个“字符”组成的字符串)string对象名(n,字符,)string类对象的操作通过string类对象的成员函数调用与重载运算符(、V、+等)对字符串进行赋值、连 接、复制、查找、交换等。基本形式为v对象名.成员函数,15Contents目录: TOC o 1-5 h z HYPERLINK l bookmark13 o Current Document C+对c语言的扩充(非类局部)1.I/O 操作1.强类型机制1.弓I用1.内联函数1.指针1.操作字符串数据的标准库函数2.new 与 de
23、lete 运算符2.作用域访问符2 HYPERLINK l bookmark17 o Current Document 类与对象2.面向对象程序设计的特点2.类的声明2.构造函数与析构函数3.拷贝构造函数3.组合类3.对象指针3.动态申请内存操作符new4 HYPERLINK l bookmark21 o Current Document C+的程序结构4面向对象程序的结构:4静态成员5友元6常类型6动态分配内存7 HYPERLINK l bookmark31 o Current Document 继承与派生7派生类的声明7多继承7类的继承方式8类型兼容规那么10派生类的构造函数和析构函数10
24、小结10派生中成员的标识与访问11虚基类11对象指针11 HYPERLINK l bookmark2 o Current Document 多态性12.多态性的概念12.运算符重载12.虚函数13 HYPERLINK l bookmark8 o Current Document 群体类和群体数据的组织14.函数模板14.类模板14.string 类14面向对象程序设计C+一、C+对C语言的扩充(非类局部). I/O操作.强类型机制.引用引用作为对象的别名而使用,对引用的改动实际是对象的改动,当建立引用时, 程序用另一个变量或对象名字初始化它。引用的声明形式为:v类型标识符,&引用名=对象名或v
25、类型标识符,&引用名=对象名其中,引用名必须遵守变量的命名规那么,前面的数据类型就是它所引用对象的数 据类型。引用不是值,不占存储空间,声明引用时,对象的存储状态是不会改变 的。.内联函数内联函数是在编译时将函数体嵌入在每一个调用语句处,节省了参数传递、系统栈的保护 与恢复等的开销。内联函数的定义形式为: v类型标识符,v内联函数名,(形参表)函数体).指针(1)基本操作与指针有关的基本运算符有以下两个:(1)&变量名&为取地址运算符,用来获取变量的首地址。*指针变量名*为指向运算符,用来获取指针变量所指向变量的值。&和*运算符都是单目运算符,其优先级高于所有双目运算符,采用从右到左的结合性(
26、2) const修饰符与指针const与指针在一起使用,情况比拟复杂,可简单归纳为三种:指向常量的指针、常指针和 指向常量的常指针。(1)指向常量的指针:是一个指向常量的指针变量。例如:const char *name =chen”; 声明一个名为name的指针变量name3=/错误,不容许改变已指向的常量name =zhang”;正确,可以改变指针的指向(2)常指针:把指针本身声明为赏量。例如:char *const name二chen; /声明一个名为 name 的常指针namc3=宜;/正确,所指的数据可以改变name=HzhangM;/错误,不容许改变指针本身(3)指向常量的常指针:指
27、针本身与它所指向的数据值均不能改变,例如:const char *const name=chen”;声明一个指向常量的常指针name3二宜;错误,不能改变指针所指的值name=nzhangM;错误,不能改变指针的指向面向对象程序设计C+.操作字符串数据的标准库函数函数原型函数说明char *strcpy(char *sl ,const char *s2)将字符串s2复制到字符数组si中,返回si的值char *strncpy(char *sl,const char *s2, n)将字符串S2中最多n个字符复制到字符数组si中,返 回S1的值char *strcat(char *s 1,cons
28、t char *s2)将字符串S2添加到字符串si后面。s2的第一个字符覆 盖si的NULL终止符。返回si的值chai* *strncat(char *sl,const char *s2, n)将字符串s2中最多n个字符添加到字符串si后面。s2 的第一个字符覆盖si的NULL终止符。返回si的值int strcmp(const char *sl,const char *s2)比拟字符串si与字符串s2o当函数在si等于、小于或 大于s2时,分别返回0、小于0或大于0的值int strncmp(const char *sl,const char *s2,n)比拟字符串si中的前n个字符与字符
29、串s2o当函数在si 的前n个字符等于、小于或大于s2时,分别返回0、小于 0或大于0的值. new与delete运算符new和delete运算符用来代替函数malloc()和free(),动态控制内存的分配和释放。delete 一定要配对释放用new分配的内存,否那么会导致内存泄漏、程序失控。使用new的长处:Lmalloc()时函数,必须要用强制类型说明;而new是操作符,能自动返回正确的指针类型;2. New操作自动计算分配类型的长度,不须sizeof操作符。8 作用域访问符运算符::用于访问(即分辨)全局名字(变量、对象等)二、类与对象.面向对象程序设计的特点抽象性、封装性、多态性、继
30、承性.类的声明类的声明即类的定义,声明一个类的语法与结构的声明类似:class v类名/class是声明类的关键字|private:v私有成员函数和数据成员的说明public:公有成员函数和数据成员的说明;v各个成员函数的实现类的成员函数用于对数据成员进行处理,又称为“方法。程序中通过类的成员函数来访问其 内部的数据成员。一般类中成员函数的原型声明写在类定义体内,用以说明该成员函数的形 式参数和返回值类型,而成员函数的定义体一般写在类定义之外。通常采用下面的形式定义 成员函数:面向对象程序设计C+v类型标识符,v类名:成员函数名 ( 形参表)(函数体.构造函数与析构函数构造函数:在类中声明的一
31、种特殊的成员函数;作用:将对象初始化为一个特定的状态。构造函数的名字与它所属的类名相同,被声明为公有函数,没有返回值,在创立对象时被 自动调用。构造函数可以访问类的所有数据成员,可以是内联函数,可以带有参数表,可以带默认的 形参值。构造函数也可以重载,以提供初始化类对象的不同方法。析构函数:作用:对象失效时,进行系统放弃对象内存之前的清理工作,使内存可用来保 存新的数据。析构函数本身并不实际删除对象。.拷贝构造函数定义拷贝构造函数的一般形式为:class class_name(private:public:class_name(形式参数表)构造函数函数体class_name(class_nam
32、e &ob_name) 拷贝构造函数函数体)拷贝构造函数调用场合:.用类的一个对象去初始化该类的另一个对象;.函数的形参是类的对象;.函数的返回值是类的对象。.组合类类名:类名(形参表):对象成员1(形参表),对象成员2(形参表),|类的初始化程序体)其中,构造函数冒号后的局部“对象成员1(形参表),对象成员2(形参表),”称作成员初始 化列表,用于完成对组合类中所包含的对象成员的初始化,该表列出了初始化各对象成员所 使用的构造函数。注意:各成员对象的构造函数的调用次序与这些成员对象在类中的声明次序一致,而与成 员初始化列表中给出的次序无关。.对象指针声明形式类名*对象指针名;面向对象程序设计
33、C+例Point A(5,10);Piont *ptr;ptr=&A;通过指针访问对象成员对象指针名,成员名ptr-getx()相当于(*ptr).getx();.动态申请内存操作符newnew类型名T (初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0 (NULL)delete 指针 P功能:释放指针P所指向的内存。P必须是new操作的返回值。三、C+的程序结构1.面向对象程序的结构:(1)作用域1)函数原型作用域函数原型作用域开始于函数原型声明的左括号“(,结束于右括号例如:double Area(double length, double width);函数原型作用域是C+程序中最小的作用域。由于形参length和width只在括号之内有效,在程序的其它地方无法引用这个标识符,如果 要引用,必须重新定义。因此,这里的标识符length和width实际上是可有可无的,省去它, 也决不会影响到程序的编译和运行结果。例如:double Area(double, double);2)块作用域
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防汛应急预案怎样写
- 《供配电技术》2.3 教案
- 电话销售转正总结8篇
- 省级医院主治医生聘用合同(32篇)
- 幼儿园大班家长工作计划
- 大学毕业生的自我总结(3篇)
- 幼儿园社会实践个人总结范文(31篇)
- DB12-T 1097-2021 公路水运品质工程示范创建评价规范
- 河南省新乡市(2024年-2025年小学五年级语文)人教版期末考试(下学期)试卷及答案
- 2024年水处理阻垢分散剂系列项目投资申请报告代可行性研究报告
- 心电监护并发症预防及处理
- 甲鱼宣传方案策划
- 脑梗死的护理病历
- 慢病管理及远程医疗的应用
- 学校个性化课程管理制度
- 肺炎支原体性肺炎护理课件
- 黑色素瘤护理的课件
- 水性可剥离涂料的制备
- 贝克抑郁量表(BDI)
- 科学论文中的学术不端案例分析
- 科学计算课件
评论
0/150
提交评论