书签 分享 收藏 举报 版权申诉 / 148
上传文档赚钱

类型第14章C-面向对象程序设计.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3183340
  • 上传时间:2022-07-30
  • 格式:PPT
  • 页数:148
  • 大小:687.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第14章C-面向对象程序设计.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    14 面向 对象 程序设计
    资源描述:

    1、 C+面向对象程序设计面向对象程序设计 C语言具有许多优点,但是随着社会对软件需求的不断扩大、复杂性不断提高、规模日益增加,结构化的方法,就很难适应这种变化的需要。为了适应这种变化的需要,一种新的程序设计方法面向对象的程序设计方法被提出,当然面向过程的程序设计语言就不能满足这种新方法的需要。在20世纪80年代,在C语言基础上,增加了对面向对象程序设计方法的支持,形成带类的C,1983年正式命名为C+。C+面向对象程序设计面向对象程序设计在本章介绍的内容有:C+语言的特点由C向C+过渡面向对象的方法类与对象继承与派生多态性 14.1 C+的特点的特点特点:对C兼容、支持面向对象,但不是纯真面向对

    2、象的语言,支持面向过程的结构化程序设计,又支持面向对象的程序设计不是高级的C,从概念上讲,是完全不同的计算机语言。14.2由由C向向C+过渡过渡 与类无关的C+语言的独特之处1、注释行 在C+中,除了用“/*”和“*/”括起来作为注释分界符号外,另一种更有效的注释方法就是使用“/”,从“/”开始直到它所在行的行尾,所有字符均被作为注释处理。如:/This is a example.int i;/i is a integer2).14.2由由C向向C+过渡过渡2、声明语句 在C+中,可以在任何需要的地方声明变量,但是我们不提倡这样,它不利于程序的维护。如:for(int i=0;i10;i+)i

    3、nt length=5*i;14.2由由C向向C+过渡过渡3、C+的输入输出 1.I/O流流 在C中,printf和scanf是两个标准输入输出函数,在头文件stdio.h中声明。在C+面向对象程序设计中,将数据从一个对象到另一个对象的流动抽象为“流”。从流中获取的操作称为提取操作,向流中添加数据的操作称为插入操作。C+的输入输出是通过I/O流来实现的,cin和cout是预定义的流类对象,它们是在iostream.h中定义的。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即显示器输出。C+预定义的标准流如表14.1 14.2由由C向向C+过渡过渡3、C+的输入输出 1.I/O流

    4、 流名流名 含义含义 默认设备默认设备cin 标准输入标准输入 键盘键盘cout 标准输标准输出出 显示器显示器cerr 标准出错输出标准出错输出 显示器显示器clog cerr的缓冲形式的缓冲形式 显显示器示器 14.2由由C向向C+过渡过渡3、C+的输入输出 2.预定义的插入符和提取符 当程序需要在屏幕上显示输出时,可以使用插入操作符“”向cout输出流中插入字符,格式如下:cout表达式1表达式2 例:cout“This is a program.n”;cout”a+b=”,从键盘取得数据送到输入流cin中,再到内存。格式如下:cin表达式1表达式2 例:int a,b;cinab;在输

    5、入语句中,提取操作符可以连续多个,每一个后面跟一个表达式,该表达式一定是用来存放输入数据的变量。下面举一个完整的例:14.2由由C向向C+过渡过渡3、C+的输入输出 2.预定义的插入符和提取符【例141】从键盘输入两个数,找出最大值,显示最大值的平方根。#include#include void main()double a,b,c;cout a b;/处理键盘输入,即从cin流中取数据 c=ab?a:b;cout the squart of maximum=sqrt(c)y?x:y;return xy?x:y;14.2由由C向向C+过渡过渡5、任何函数调用之前必须有函数声明或定义 在C语言中

    6、允许在调用函数前不声明或定义函数,例如:【例143】调用函数,输出两个数中的最大值#include int max(int x,in y)return xy?x:y;void main()int x=5,y=4,m;m=max(x,y);coutmendl;14.2由由C向向C+过渡过渡6、函数声明时形式参数不能省略 C+中函数声明时,形式参数不能省略,并且只能采用ANSI新标准推荐的现代方式声明。如果省略,则所声明的函数就是无形式参数的函数。但在C中函数声明时,形式参数是可以省略的。14.2由由C向向C+过渡过渡6、函数声明时形式参数不能省略【例144】调用函数,输出两个数中的最大值#inc

    7、lude int max(int,int);void main()int x=5,y=4,m;m=max(x,y);coutmy?x:y;14.2由由C向向C+过渡过渡6、内联函数 为了有利于代码重用和提高软件开发效率,增强程序的可读性、可靠性和可维护性,在程序中,一般都使用函数,但是,使用函数也会降低程序的执行效率。因为在函数调用时,需要保护现场和返回地址,然后去执行子函数。子函数执行完后,又要取出保存的地址和现场状态,再继续执行。这些都需要时间和资源。14.2由由C向向C+过渡过渡6、内联函数 对于一些功能简单、程序规模小而又频繁使用的函数,可以设计为内联函数。内联函数与一般函数调用时不同

    8、,而是在编译时将函数体嵌入在每一个调用语句处,这样就节省了时间和资源。内联函数在定义时使用关键字inline,格式有两种形式:1)、声明同时定义函数体inline 类型说明 函数名(含类型说明的形式参数);14.2由由C向向C+过渡过渡 2)、先声明后定义)、先声明后定义声明形式如下:声明形式如下:inline 类型说明类型说明 函数名(含类型说明的形式函数名(含类型说明的形式参数);参数);在程序的任何位置定义函数体,形式如下:在程序的任何位置定义函数体,形式如下:类型说明类型说明 函数名(含类型说明的形式参数)函数名(含类型说明的形式参数);在定义函数体时,不能再带有关键字在定义函数体时,

    9、不能再带有关键字inline。14.2由C向C+过渡 注意:使用内联函数应注意以下两点:(1)、内联函数体内不能有循环语句和switch语句;(2)、内联函数必须在第一次调用前声明或定义。对于复杂和规模大的函数,尽管使用频繁,也不要写成内联函数的形式,这样会增加程序的规模。例如:14.2由C向C+过渡【例145】内联函数的声明、定义与调用#include inline int isnumber(char);/函数声明void main()char c;while(c=cin.get()!=n)/接收输入 if(isnumber(c)/调用内联函数,并判定函数返回值 cout you enter

    10、ed a digitn;/函数返回值为1 else cout=0&ch=9)?1:0;14.2由C向C+过渡14.2.8带默认形参值的函数 函数在定义时可以预先定义一个默认的形参值。在函数调用时,如果给出实参,则用实参初始化形参;如果没有给出实参,就用预先给定的默认值。例如:14.2由C向C+过渡【例146】带默认形参值的函数的声明与定义#include int add(int a=5,int b=9)/形参a与b的默认值分别为5和9return a+b;/两数相加void main()add(15,20);/用实参初始化形参,实现15+20add(15);/形参a用15,b用默认值9,返回值

    11、为24add();/a、b都用默认值,返回值为14 14.2由C向C+过渡注意:1)、如果定义某个形式参数带有默认值,则必须定义所有后续形式参数也带有默认值,即在有默认值参数的右面,不能出现无默认值的形参。例如:void ShowMessage(char*Text,int Length=-1,int Color);此函数定义为错,应定义为:void ShowMessage(char*Text,int Length=-1,int Color=0);14.2由C向C+过渡2)、调用函数时省略带有默认参数,则必须省略该参数所有后续参数【例147】#include void point(int x=5

    12、,int y=6,int z=7);/函数声明void main()cout显示默认参数:endl;point();/省略 14.2由C向C+过渡所有参数利用默认值cout第二、三参数用默认值endl;point(10);/省略第二、三参数利用默认值cout第三参数用默认值endl;point(10,9);/省略第三参数利用默认值cout三个参数用实参传递的值endl;point(10,9,8);/利用实参的值 14.2由C向C+过渡void point(int x,int y,int z)/函数定义 coutx=xendl;/输出x couty=yendl;/输出y coutz=zendl;

    13、/输出z运行结果为:图14.1 程序运行结果 14.2由C向C+过渡3)、如果是先声明后定义函数,则在声明时给出)、如果是先声明后定义函数,则在声明时给出默认值,在定义时就不能给出默认值,否则出错默认值,在定义时就不能给出默认值,否则出错。14.2由C向C+过渡14.2.9函数的重载函数的重载 在C语言中,函数名不能相同,如果相同,就出错,但在C+中,提供了对重载的支持。所谓重载,就是在程序中相同的函数名对应不同的函数实现。函数重载允许程序内多个名称相同的函数,这些函数可以完成不同的功能,并且带有不同的类型、不同的形参个数及不同的返回值。14.2由C向C+过渡使用函数重载,就可以把功能相似的函

    14、数名命名为一个相同的标示符,减轻程序员对于函数的记忆负担,使程序结构简单、易懂。例如:【例148】求各种不同数据类型的和#include 14.2由C向C+过渡/函数声明 int add(int,int);/两个整数相加 int add(int,int,int);/三个整数相加 double add(double,double);/两个浮点数相加 double add(double,double,double);/三个浮点数相加void main()cout求整数5、6的和add(5,6)endl;cout求整数5、6、7的和add(5,6,7)endl;cout求浮点数4.2、5.9的和ad

    15、d(4.2,5.9)endl;cout求浮点数4.2、5.9、9.3的和add(4.2,5.9,9.3)endl;14.2由C向C+过渡/函数定义int add(int x,int y)/两个整数相加return x+y;int add(int x,int y,int z)/三个整数相加 return x+y+z;double add(double x,double y)/两个浮点数相加 return x+y;double add(double x,double y,double z)/三个浮点数相加 return x+y+z;14.2由C向C+过渡图14.2 程序运行结果 14.2由C向C+

    16、过渡提示:函数的重载要求编译器能够唯一地确定应该调用的函数,即应该采用哪一个函数来实现。为了不造成混乱,则要求重载函数的形参数个数或形参数的类型或形参的排列顺序不同。也就是说,函数重载,函数名可以相同,但函数形参的个数或类型或排列顺序不能相同。14.2由C向C+过渡14.2.10作用域操作符作用域操作符 作用域是一个标示符在程序中的作用范围。当局部变量与全局变量同名时,局部变量掩盖全局变量。但在有时需要操作与局部变量同名的全局变量时,就可以用作用域操作符“:”来访问全局变量,格式是在全局变量名前加作用域操作符。14.2由C向C+过渡例如:【例149】作用域操作符的使用double A;/全局变

    17、量Avoid main()int A;/局部变量A A=5;/为局部变量A赋值 :A=2.5;/为全局变量A赋值 coutAendl;/输出局部变量的值5 cout:Aendl;/输出全局变量的值2.5 14.2由C向C+过渡14.2.11 new和和delete操作符操作符 在编写程序时,常常需要动态分配和释放内存空间,在C语言中是利用库函数malloc()和free()函数来实现的。但是malloc函数需要预先知道应该分配的内存空间的大小,其调用形式为malloc(size),这里的size是分配的字节数。可以给定具体数,也可以用sizeof运算来测定。同时其返回值为void型,需要进行强

    18、制类型转化,才能得到所需要的指针指向的类型。14.2由C向C+过渡 在C+中,提供了功能更强大的运算符new与delete,不需头文件,new比malloc()更简练,new操作符自动确定对象的正确长度并返回正确类型指针。使用类对象时,new自动调用类的构造函数,delete自动调用类的析构函数。关于类对象、类构造函数、类析构函数在后面讲解。14.2由C向C+过渡例如:int*i;/定义一个指向整型的指针i=new int;/分配一个存储整型数据的空间,返回一个指向整型数据的指针i=new int(50);/分配一个存储整型数据的空间,返回一个指向整型数据的指针,并赋初值为50。i=new i

    19、nt10;/分配一个长度为10的一维整型数组的空间,返回一个指向整型数组的指针,以后i就象int i10一样,来使用i。但是这里是动态分配的空间,当然在用完以后,可以撤消动态分配的空间,而int i10,所分配的空间是静态的。14.2由C向C+过渡用new分配空间的格式是:1)、先定义指针变量,再分配存储空间指针变量=new 类型(初值)如:float*f;f=new float;/不给初值或f=new float(3.14159);/给初值再如:char*ch;ch=new char;/分配一个存储字符数据的空间,返回一个指向字符数据的指针。或ch=new char50;/分配一个长度为10

    20、的一维字符数组的空间,返回一个指向字符数组的指针 14.2由C向C+过渡2)、在定义指针变量的同时分配存储空间例如:float*f=new float;/不给初值或float*f=new float(3.14159);/给初值再如:char*ch=new char;/分配一个存储字符数据的空间,返回一个指向字符数据的指针。或char*ch=new char50;/分配一个长度为10的一维字符数组的空间,返回一个指向字符数组的指针 14.2由C向C+过渡用delete运算符释放用new分配的存储空间,其格式为:delete 被释放指针变量;如:delete i;delete ch;但是delet

    21、e 释放的是数组时,应该在指针变量前带“”,以示要回收的是数组而不是单个基本类型对象。14.2由C向C+过渡例如:delete i;/释放的是数组delete ch;/释放的是一个数组例如:【例1410】new和delete运算符的使用#include struct student/定义结构体int num;/学号 char name20;/姓名 char sex;/性别 int age;/年龄;14.2由C向C+过渡void main()student*stu1;/定义一个指向结构体的指针stu1=new student;/利用操作符为指针变量分配存储空间stu1-num=20;/赋值str

    22、cpy(stu1-name,”Xiao Qing”);/赋值stu1-sex=F;/赋值stu1-age=18;/赋值delete stu1;/释放存储空间 14.2由C向C+过渡 先声明了一个结构体类型student,在主函数中定义了一个指向student类型的指针变量stu1,用new分配用于存储student类型数据的存储空间,空间的大小由系统根据student的自己确定,返回一个指向student类型的指针,存储在stu1中,然后就是给结构体的成员变量赋值。最后用delete运算符,释放被分配的存储空间。提示:当用new分配存储空间失败时,返回的是一个空指针NULL,可以用来判断分配存

    23、储空间是否成功。new与delete是运算符,成对使用,而malloc与free是一对函数,在C+中,保持了对这对函数的支持。14.3 面向对象的方法14.3.1 面向对象的语言面向对象的程序设计语言与面向过程的程序设计面向对象的程序设计语言与面向过程的程序设计语言的根本不同点在于:它设计的出发点不再语言的根本不同点在于:它设计的出发点不再是按照功能分解的方式来划分模块,而是以客是按照功能分解的方式来划分模块,而是以客观世界中存在的事物(即对象)为研究对象,观世界中存在的事物(即对象)为研究对象,研究对象的属性、行为以及对象之间相互作用研究对象的属性、行为以及对象之间相互作用的关系。的关系。面

    24、向对象的程序设计语言经历了一个很长的发展面向对象的程序设计语言经历了一个很长的发展过程,应用最广的面向对象的语言是由过程,应用最广的面向对象的语言是由C语言发语言发展而来的展而来的C+语言,由于它对语言,由于它对C语言的兼容,而语言的兼容,而C语言已经被人们所熟悉,有语言已经被人们所熟悉,有C作为基础学习作为基础学习C+就有得天独厚的条件。就有得天独厚的条件。14.3 面向对象的方法14.3.2 面向对象方法 面向对象方法的出发点,就是模拟人类的认识事物解决问题的过程来开发软件,这是学习和理解面向对象方法的关键。面向对象方法中提到的“对象”,是软件开发者根据自己的研究范畴来定义或选取。对象通过

    25、抽象,找出同一类对象的共同属性和行为,形成类,如抽象汽车和火车的共同属性和行为,忽略其差异,形成“车”这个类。通过类的继承、多态就可以实现代码的重用,提高程序开发效率,缩短开发周期。14.4 类与对象 在面向对象的程序设计中,程序的模块是由类构成的,类是数据和函数的封装体,是对所要处理的问题的抽象描述。类实际上相当于是用户自定义的数据类型,就象在C语言中的结构体一样,不同的是结构体中没有对数据的操作,类中封装了对数据的操作(在C+中结构体中也可以有对数据操作的函数,但与类的操作有区别),可以利用自定义的类型来定义变量,这个变量就称为类的对象(或实例),声明的过程称为类的实例化。14.4 类与对

    26、象 14.4.1 类的定义在使用类之前必须先定义类,定义一个类的语法格式为:class 类名 private:私有成员数据和函数;protected:保护成员数据和函数;public:公有成员数据和函数;类的对象定义;14.4 类与对象 在面向对象的程序设计中,程序的模块是由类构成的,类是数据和函数的封装体,是对所要处理的问题的抽象描述。类实际上相当于是用户自定义的数据类型,就象在C语言中的结构体一样,不同的是结构体中没有对数据的操作,类中封装了对数据的操作(在C+中结构体中也可以有对数据操作的函数,但与类的操作有区别),可以利用自定义的类型来定义变量,这个变量就称为类的对象(或实例),声明的

    27、过程称为类的实例化。14.4 类与对象说明:1)、)、class是关键字,不能省略;是关键字,不能省略;2)、类名的命名规则,与)、类名的命名规则,与C语言中的标示符的命语言中的标示符的命名规则一致;名规则一致;3)、类中的数据)、类中的数据(又称数据成员又称数据成员)和函数和函数(又称成又称成员函数员函数)分为三种访问控制属性,分别由三种分为三种访问控制属性,分别由三种访问控制修饰符访问控制修饰符 public(公有类型)(公有类型),private(私有类型)(私有类型),protected(保护类型)加以修(保护类型)加以修饰。饰。14.4 类与对象4)、)、private、protec

    28、ted和和public是关键字,是对数是关键字,是对数据成员和成员函数的访问控制,不分先后顺序,用据成员和成员函数的访问控制,不分先后顺序,用于修饰在它们之后列出的数据成员和成员函数能被于修饰在它们之后列出的数据成员和成员函数能被程序的其它部分访问的权限。缺省的情况下为程序的其它部分访问的权限。缺省的情况下为private。在声明类时,并不一定三种控制类型的成。在声明类时,并不一定三种控制类型的成员必须都有。员必须都有。5)、)、public:指定其后的成员是公有的。它们是类与指定其后的成员是公有的。它们是类与外部的接口,任何外部函数都可以通过对象访问公外部的接口,任何外部函数都可以通过对象访

    29、问公有数据成员和成员函数。有数据成员和成员函数。6)、)、private:指定其后的成员是私有部分。若省略关指定其后的成员是私有部分。若省略关键字键字private,则必须紧跟在类名称后声明。类中的,则必须紧跟在类名称后声明。类中的数据和函数若不特别声明,都被视为私有类型。数据和函数若不特别声明,都被视为私有类型。14.4 类与对象7)、)、protected:保护类型,这种类型的数据也只能:保护类型,这种类型的数据也只能被类本身的成员函数访问,但可以被派生类继承被类本身的成员函数访问,但可以被派生类继承(关于派生类继承在后面介绍)。(关于派生类继承在后面介绍)。【例【例1411】类的定义与三

    30、种访问控制符的运用类的定义与三种访问控制符的运用 14.4 类与对象class Cperson/定义类、类名为定义类、类名为Cpersonpublic:/公有公有void SetData(char name,int age,float height);private:/私有私有char Name20;int Age;float Height;public:/公有公有void PrintAge();void PrintHeight();14.4 类与对象1)、这里封装了人的数据和行为,分别称为)、这里封装了人的数据和行为,分别称为CPerson类的数据成员和成员函数;类的数据成员和成员函数;2)

    31、、各种访问控制在类的定义中,可以以任意)、各种访问控制在类的定义中,可以以任意的顺序出现,根据需要也可以同一种访问控制的顺序出现,根据需要也可以同一种访问控制出现多次。出现多次。14.4 类与对象14.4.2 类的成员函数类的成员函数 类的成员函数描述的是类的行为,它是程序算法的一部分,是对封装在类中的数据唯一的操作途径。1.成员函数体的定义 函数的原型声明应该在类的主体中,原型声明时同C语言中函数的声明一样,而函数体的定义可以在类体中声明函数的同时定义函数体,也可以声明以后,在类体外,再来定义函数体。1)、在类体中声明函数同时定义函数体【例1412】在定义类的同时定义函数 14.4 类与对象

    32、 class CPerson public:void SetData(char name,int age,float height)/给成员变量赋初值 strcpy(Name,name);Age=age;Height=height;Return;private:char Name20;int Age;float Height;public:void PrintAge();void PrintHeight();14.4 类与对象 2)、在类体中声明函数)、在类体中声明函数,在类体外定义函数体在类体外定义函数体一般格式为:返回值类型 类名:成员函数名(形参表)函数体;例如:【例1413】在类体中声

    33、明函数,在类体外定义函数体 14.4 类与对象void Cperson:SetData(char name,int age,float height)strcpy(Name,name);Age=age;Height=height;return;14.4 类与对象 2.带默认值的成员函数 在前面介绍了带默认形参值的函数。同样,在类中声明成员函数时,可以为成员函数的参数指定缺省参数值,但在定义函数体时,就不能再带有默认形参值,其声明、函数体的定义及调用规则同前面的讲的函数相同,在实际的程序设计中,默认值可以带来很大的方便。例如:【例1414】带有默认参数值的成员函数声明与定义 14.4 类与对象c

    34、lass CPersonpublic:void SetData(char name,int age=0,float height=0.0);/带默认形参值private:char Name20;int Age;float Height;public:void PrintAge();void PrintHeight();14.4 类与对象/函数体的定义void Cperson:SetData(char name,int age,float height)/不带默认形参值strcpy(Name,name);Age=age;Height=height;return;14.4 类与对象 3.内联成员函

    35、数 类的成员函数也可以声明和定义成内联函数。内联函数是指定义在类体中的成员函数。内联函数在调用时不象一般的函数那样,转去执行被调用函数的函数体,而是编译时在调用函数处用内联函数的代码来替换。在C+中,可以使用两种格式来定义类的内联成员函数:1)在定义类时,与一般成员函数的声明一样,但)在定义类时,与一般成员函数的声明一样,但 在定义函在定义函 数体时,把关键字数体时,把关键字inline加在函数定义之加在函数定义之前。前。14.4 类与对象【例1415】带有内联函数的类的定义class CPersonpublic:void SetData(char name,int age=0,float h

    36、eight=0.0);/带默认形参值private:char Name20;int Age;float Height;public:void PrintAge();void PrintHeight();14.4 类与对象内联函数体的定义inline void Cperson:SetData(char name,int age,float height)/在前面加关键字inlinestrcpy(Name,name);Age=age;Height=height;return;14.4 类与对象2)、声明成员函数的同时定义函数体,这时的所定义的函数也是、声明成员函数的同时定义函数体,这时的所定义的函

    37、数也是 内联函内联函数。例如:数。例如:【例1416】在类体中声明成员函数同时定义函数体class CPersonpublic:void SetData(char name,int age,float height)/函数体位于类定义中strcpy(Name,name);Age=age;Height=height;Return;14.4 类与对象private:char Name20;int Age;float Height;public:void PrintAge();void PrintHeight();函数SetData()为内联函数。14.4 类与对象 14.4.3构造函数和析构函数

    38、在C+中,有两个特殊的函数,一个是构造函数(Constructor),一个是析构函数(Destructor),构造函数是用来进行初始化的,而析构函数是用来在最后清理工作的,如申请的内存释放等。这个函数不需要明显的调用,在对象使用完成后自动调用。14.4 类与对象 1.构造函数构造函数 构造函数是一个特殊的成员函数,主要用来初始化,如:分配内存空间、赋初值。实际上如果我们不定义构造函数的话,默认的也有一个构造函数,只是这个构造函数不做任何初始化的工作,但构造函数是存在的。构造函数的函数名是类名,并且该函数没有返回值,也没有返回值的类型。可以有形式参数。例如:【例1417】构造函数的声明形式 14

    39、.4 类与对象class CPersonpublic:CPerson(char name,int age,float height);/构造函数private:char Name20;int Age;float Height;public:void PrintAge();void PrintHeight();14.4 类与对象分析:构造函数体的定义与一般函数一样,可以在声明同时定义,也可以在声明后,再定义函数体,也可以有形式参数默认值。先声明函数再定义函数体【例1418】构造函数体的定义 Cperson:CPerson(char name,int age,float height)strcpy

    40、(Name,name);Age=age;Height=height;14.4 类与对象在类体中声明的同时定义函数体在类体中声明的同时定义函数体例如:例如:【例【例1419】在类体中声明的同时定义函数体在类体中声明的同时定义函数体class CPersonpublic:CPerson(char name,int age,float height)/在类体中声明的同在类体中声明的同时定义函数体时定义函数体strcpy(Name,name);Age=age;Height=height;14.4 类与对象private:char Name20;int Age;float Height;public:v

    41、oid PrintAge();void PrintHeight();另外构造函数也可以重载。另外构造函数也可以重载。14.4 类与对象 2.析构函数 析构函数也是一个特殊的成员函数,主要用来清理释放的工作,如:内存空间的释放。实际上如果我们不定义析构函数的话,默认的也有一个析构函数,只是这个析构函数不做任何事情,但析构函数是存在的。析构函数的函数名是类名,但要在函数名前加“”,并且该函数没有返回值,也没有返回值的类型,也没有形式参数。14.4 类与对象例如:【例1420】析构函数声明class CPersonpublic:CPerson(char name,int age,float heig

    42、ht)Name=new char20;strcpy(Name,name);Age=age;Height=height;14.4 类与对象 Cperson();/析构函数private:char *Name;int Age;float Height;public:void PrintAge();void PrintHeight();14.4 类与对象 析构函数体的定义与一般函数一样,可以在声明同时定义,也可以在声明后,再定义函数。(1)、先声明函数再定义函数体。例如:【例1421】先声明析构函数再定义析构函数体Cperson:CPerson()cout”这里删除Name”endl;delete

    43、Name;14.4 类与对象(2)、在类中声明析构函数的同时定义析构函数体。例如:【例1422】在类体中声明的同时定义析构函数体class CPersonpublic:CPerson(char name,int age,float height)Name=new char20;strcpy(Name,name);Age=age;Height=height;14.4 类与对象 Cperson()/在类体中声明的同时定义析构函数体cout”这里删除Name”endl;delete Name;private:char Name20;int Age;float Height;public:void P

    44、rintAge();void PrintHeight();另外析构函数不能被重载。14.4 类与对象 14.4.4对象对象 在在C+C+中,类是一种自定义的数据类型,对中,类是一种自定义的数据类型,对象是声明为类类型的一个实例(象是声明为类类型的一个实例(InstanceInstance),即为),即为变量。因此对象的声明与声明一个基本类型的变量变量。因此对象的声明与声明一个基本类型的变量是一样的。是一样的。1.1.对象的定义对象的定义有两种方法可以定义类的对象:有两种方法可以定义类的对象:14.4 类与对象(1)、在定义类的同时直接定义类的对象,即:class 类名 成员变量;成员函数:对象

    45、名列表;这里的对象名列表可以有一系列,但每个对象之间用逗号分开。(2)、先定义类,再定义类的对象。即:类名 类对象1,类对象2,;14.4 类与对象2.对象的公有成员的访问 只有类定义时,访问控制被定义为公有的成员才能被访问,这种访问采用的是对象选择符“.”,“.”点运算符,一般形式为:对于成员函数的访问:对象名.公有成员函数(实参);对于成员变量的访问:对象名.数据成员名=赋值;14.4 类与对象例如:例如:【例【例1423】对象的定义与对象的定义与“.”点运算符的使用点运算符的使用#include#includeconst double ANG_TO_RAD=0.0174532925;/定

    46、义常数定义常数class CAngle/定义类定义类 double Value;/私有成员变量私有成员变量public:void SetValue(double);/公有成员函数公有成员函数double GetCos();/公有成员函数公有成员函数vcos;/定义的同时定义类对象定义的同时定义类对象 14.4 类与对象/成员函数定义成员函数定义void CAngle:SetValue(double value)/为成员变量为成员变量Value赋值赋值Value=value;double CAngle:GetCos()/计算计算cos值值double temp;temp=cos(ANG_TO_R

    47、AD*Value);return temp;14.4 类与对象void main()vcos.SetValue(45.0);/给类成员变量Value赋值coutCOS的值是:;coutvcos.GetCos()endl;/输出值CAngle vcos1;/定义另一个对象vcos1.SetValue(60.0);/给类成员变量Value赋值coutCOS的值是:;coutvcos1.GetCos()”格式为:指针变量名-数据成员;指针变量名-成员函数;如:ang1-SetValue(60.0);14.4 类与对象(3)、用)、用delete操作符释放内存空间操作符释放内存空间 当所定义的指针已经

    48、不再用时,应尽快释放其占有的内当所定义的指针已经不再用时,应尽快释放其占有的内存空间。存空间。一般格式为:一般格式为:delete 指针变量名;指针变量名;例如:例如:【例【例1424】指向类对象的指针访问类的公有成员指向类对象的指针访问类的公有成员#include#includeconst double ANG_TO_RAD=0.0174532925;/定义常数定义常数 14.4 类与对象class CAngle/定义类 double Value;/私有成员变量public:void SetValue(double);/公有成员函数double GetCos();/公有成员函数*vcos;/

    49、定义的同时定义类对象指针/成员函数定义void CAngle:SetValue(double value)Value=value;double CAngle:GetCos()double temp;temp=cos(ANG_TO_RAD*Value);return temp;14.4 类与对象void main()vcos=new CAngle;/分配内存空间分配内存空间vcos-SetValue(45.0);/给类成员变量给类成员变量Value赋值赋值coutCOS的值是:的值是:;coutGetCos()SetValue(60.0);/给类成员变量给类成员变量Value赋值赋值coutCO

    50、S的值是:的值是:;coutvcos1.GetCos()endl;/输出值输出值delete vcos1;/释放内存空间释放内存空间 14.4 类与对象运行结果为:运行结果为:图图14.程序运行结果程序运行结果 14.5 继承与派生 类的继承,是新的类从已有的类那里得到已有类的继承,是新的类从已有的类那里得到已有的特性。换一个角度来说,从已有的类为基础产生的特性。换一个角度来说,从已有的类为基础产生新类的过程就是类的派生。原有的类称为基类,或新类的过程就是类的派生。原有的类称为基类,或称为父类。产生的新类称为派生类,或称为子类。称为父类。产生的新类称为派生类,或称为子类。派生类同样可以作为新的

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第14章C-面向对象程序设计.ppt
    链接地址:https://www.163wenku.com/p-3183340.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库