面向对象程序设计及C++ 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 朱立华 俞琼 第3章_类与对象new

上传人:E**** 文档编号:89494835 上传时间:2019-05-25 格式:PPT 页数:66 大小:1.95MB
返回 下载 相关 举报
面向对象程序设计及C++ 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  朱立华 俞琼 第3章_类与对象new_第1页
第1页 / 共66页
面向对象程序设计及C++ 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  朱立华 俞琼 第3章_类与对象new_第2页
第2页 / 共66页
面向对象程序设计及C++ 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  朱立华 俞琼 第3章_类与对象new_第3页
第3页 / 共66页
面向对象程序设计及C++ 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  朱立华 俞琼 第3章_类与对象new_第4页
第4页 / 共66页
面向对象程序设计及C++ 第2版  工业和信息化普通高等教育“十二五”规划教材立项项目  教学课件 ppt 作者  朱立华 俞琼 第3章_类与对象new_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《面向对象程序设计及C++ 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 朱立华 俞琼 第3章_类与对象new》由会员分享,可在线阅读,更多相关《面向对象程序设计及C++ 第2版 工业和信息化普通高等教育“十二五”规划教材立项项目 教学课件 ppt 作者 朱立华 俞琼 第3章_类与对象new(66页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计及C+,主讲人,第三章 类与对象,本章作业,作业本:本章习题:一、二(2 、 4) 、三、四(1 、 4),本章内容安排,3.1 类与对象的定义 3.2 构造函数与析构函数 3.3 对象的使用 3.4 友元 3.5 程序实例 3.6 本章小结,结束本章,3.1.1类的定义,类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。,1.什么是类?,2. 类的构成,数据成员:用来描述一类对象所拥有共同静态特征的数据。 成员函数:说明一类对象所拥有共同动态特征的行为。,C+语言中定义类的一般格式如下: class 类名 private: 私有数据成员和成

2、员函数 protected: 保护数据成员和成员函数 public: 公有数据成员和成员函数 ;,class是定义类的关键字,花括号表示类的定义范围,其中定义其所有的成员,实现封装功能;,分号表示类定义的结束,例3.1类定义示例日期类型,class Date private: /private可以缺省 int year; /数据成员 int month; int day; public: void SetDate(int ,int ,int ); void Display( ); int GetYear( ); int GetMonth( ); int GetDay( ); ; /切记分号不可

3、省略,进行类的定义时应注意以下几点。 (1)在类的定义中不能对数据成员进行初始化。 class AA private: int m=2011; /错误 const double PI=3.14; /错误 /其他代码 ; (2)类定义必须以分号“;”结束。如果丢失“;”符号,编译器会认为类定义没有结束,造成编译错误。,成员函数的定义通常采用两种方式。 第一种:将成员函数定义在类的内部,使其自动成为内联函数。成员函数与普通的函数一样定义,不过成员函数是封装在类的定义中的。,3. 成员函数的实现,第二种是在类定义中只给出成员函数的原型,而成员函数的定义放在类的外部。 类外定义的一般形式如下: 函数返

4、回类型 类名:成员函数名(形式参数表) /函数体 ,与普通的函数相比,在类外定义的成员函数名前一定要用“类名:”来表明该函数不是一个普通函数,而是特定类的成员函数。,在VC环境下,演示例3.2 ,例3.3,讲解头文件的建立及使用方法,分析类成员函数实现的两种方式。,【例3.2】 完整的类定义程序举例。 【例3.3】 方式1定义类的成员函数的完整的Date类定义代码,将此文件保存为:Date2.h 。,4.访问属性,访问属性又称为访问权限,通过正确设定成员的访问属性可以实现信息隐藏,又可以为外部提供访问接口。 关键字public,private和protected被称为访问权限修饰符或访问控制修

5、饰符,分别表示公有、私有和保护属性,其中的private是类默认的访问属性。,表3.1 类成员的访问属性及作用(例3.2、3.3),3.1.2 定义对象,类描述了本类对象的共同属性和行为,是一个用户自定义的数据类型,实现了封装和数据隐藏功能。但是,类作为一种类型在程序中只有通过定义该类型的变量对象,才能发挥作用。对象是类的实例或实体。 对象定义的一般格式如下: 类名 对象名1,对象名2, 对象名n; 例如: Date DateA, DateB;,定义类的对象可以有两种方式: 一种是在定义类的同时给出类的对象,如例3.3中A、B对象的定义 另一种是在类定义结束后,按形式给出 NOTE:类定义仅提

6、供该类的类型定义,不占用内存空间,只有在定义了类的对象之后,编译系统才会给对象在内存中分配相应的内存空间。,1.圆点访问形式 圆点访问形式就是使用成员运算符“.”来访问类的成员,一般格式如下: 对象名.成员 或 (*指向对象的指针). 成员 在VC下运行example3_05.cpp,2指针访问形式 就是使用成员访问运算符“-”来访问类的成员,该运算符前面必须是一个指向对象的地址。使用格式如下: 对象指针变量名成员 或 (&对象名)成员 在VC下运行example3_06.cpp 比较与example3_05.cpp的区别,再来分析下面例3.7中出现的错误以加深对象的定义、访问权限、成员调用等

7、问题的理解。 在VC下运行 example3_07.cpp:修改程序中的错误,3.1.3 this指针,在C+程序中,每个成员函数都有一个特殊的隐含指针,称为this指针。这个this指针用来存放当前主调对象的地址。 即:某个成员函数被调用时系统会自动向它传递一个隐含的参数,该参数是指向函数操作对象的指针(地址),该指针用this来引用,当一个对象调用成员函数时: 1、编译程序将this指针指向当前对象的地址 2、调用成员函数 3、每次成员函数存取数据成员时,将隐含使用 this指针,使得不同对象调用同一成员函数所处理的是对象自己的数据成员 。 在VC下运行 example3_08.cpp,在

8、内存中,每个类的成员函数只有一份拷贝,提供类的所有对象使用; 每一个类的对象对类的数据成员都有自己的拷贝 在例3.8程序中,对象 DateA调用SetDate () 和Display()时, &this-year输出的DateA中year的地址。 对象 DateB调用SetDate () 和Display()时, &this-year输出的DateB中year的地址。,返回,3.2 构造函数与析构函数,构造函数是类的一种特殊的成员函数,在定义类的对象时,系统会自动调用构造函数来创建并初始化对象。 当对象生存期结束时,需要释放所占的内存资源,这个工作由系统自动调用析构函数来完成。,3.2.1 构

9、造函数,在类体外定义构造函数的形式如下: 类名:类名(形式参数表) /函数体 若构造函数在类体内定义,则去掉前面的“类名:”限定符。,1 构造函数的声明与定义,构造函数具有的特殊性质 (1)构造函数的函数名必须与类名相同,以类名为函数名的函数一定是类的构造函数。 (2)构造函数没有返回值类型,前面不能添加“void”。 (3)构造函数为public属性,否则定义对象时无法自动调用构造函数,编译时会出现错误提示。,(4)构造函数只在创建对象时由系统自动调用,所定义的对象在对象名后要提供构造函数所需要的实际参数,形式为:对象名(实际参数表)。注意,既然在定义对象的同时系统已经完成了对象的初始化工作

10、,就不能在程序中写出形如:对象名.构造函数名(实际参数表)的调用构造函数语句。 分析例3.9,在VC下运行example3_09.cpp,2 . 系统默认构造函数及无参构造函数的定义 系统默认构造函数的格式是: 类名:类名( ) 说明:C+系统并非总是会自动生成一个默认构造函数。如果类定义时没有提供构造函数,编译器会生成像上面格式所给出的一个默认构造函数。定义该类的对象时,会自动调用这个构造函数。相反,如果类定义中已经至少为类提供了一个构造函数,C+就不会再提供默认的无参构造函数了。每次定义类对象时,C+会自动查找最合适的构造函数去调用。 修改example3_09的main函数,并分析,在使

11、用构造函数时务必注意: (1)对构造函数可以进行重载,重载的多个构造函数必须在形式参数的类型、个数和顺序这3方面的至少一方面体现出不一样,符合函数重载的条件。形式参数表可以为空。在定义重载构造函数时要注意避免出现二义性。 (2)若用户没有定义构造函数,系统会为每个类自动提供一个不带形式参数的构造函数。但是,此时只负责为对象的各个数据成员分配空间,而不提供初值。一旦用户自己定义了构造函数,系统不再提供默认的无参构造函数,这时的无参构造函数需要用户自己定义。,对于带参数的构造函数,在定义对象时必须给构造函数传递参数。但在实际应用中,有些构造函数的参数值是不发生变化的,只有在特殊情况下才需要改变它的

12、参数值,这时可以将其定义成带默认参数值的构造函数。 运行 example3_10.cpp:带默认参数的构造函数的应用举例,3. 具有默认参数值的构造函数,拷贝构造函数也是类的一个重载版本的构造函数,它能够用一个已知的对象初始化另一个新创建的同类新对象。该函数的形式参数是本类对象的常引用,因此与普通的构造函数在形式参数上有非常明显的区别。 C+为每一个类定义了一个默认的拷贝构造函数,可以实现将实参对象的数据成员值复制到新创建的当前对象的对应数据成员中。用户可以根据需要定义自己的拷贝构造函数,从而实现同类对象之间数据成员的值传递。,拷贝构造函数,拷贝构造函数的定义格式如下: class 类名 pu

13、blic: 类名(const 类名&对象名); /拷贝构造函数声明 /函数其他语句 ; 类名:类名(const 类名&对象名) /拷贝构造函数的定义 /函数语句 ,拷贝构造函数在以下3种情况下由系统自动调用。 (1)明确表示由一个对象初始化另一个对象时; (2)当对象作为函数的实际参数传递给函数的值形式参数时。注意,如果形式参数是引用参数或指针参数,都不会调用拷贝构造函数,因为此时不会产生新对象; (3)当对象作为函数返回值时。 在VC环境下分析Date3.h和example3_11.cpp,3.2.2 析构函数,创建类的对象时,系统会自动调用构造函数。同样,当对象生存期结束时,需要释放所占的

14、内存资源,这个工作由析构函数来完成。 析构函数的定义格式如下: 类名:类名() / ,说明: (1)析构函数也是类的特殊成员函数,其函数名与类名相同,但在类名前要加“”号。 (2)析构函数没有返回值类型,前面不能加“void”,必须定义为公有成员函数。 (3)析构函数没有形式参数,此时形式参数表内不能写成(void)形式,由于无形式参数,因此析构函数不能被重载,每个类只能拥有一个析构函数。 (4)析构函数的调用也是自动执行的,在两种情况下自动执行析构函数:一种是在对象生存期结束时系统会自动调用析构函数;第二种是对用new运算符动态创建的对象,在用delete运算符释放时,也自动调用析构函数。,

15、在之前的程序中没有显式定义析构函数,并不表示程序中没有析构函数,与构造函数一样,系统提供一个默认的析构函数,其函数体为空: Date() /默认的析构函数,一般情况下使用系统默认的析构函数就可以了。但是,如果一个类中有指针类型的数据成员,并且在构造函数中该指针申请了动态空间,此时一定要定义析构函数来释放通过指针所申请的动态空间,保证对象生存期结束时释放所有的内存空间。 在VC下运行example3_12.cpp:注意构造函数与析构函数的调用顺序,该例中只创建了对象today和newday,随即主函数结束,newday与today的生存期也结束。所以,系统在自动调用构造函数完成创建对象后立即调用析构函数,完成内存清理等工作。由程序的运行结果可以看出,系统在创建对象时调用构造函数的顺序与主函数中创建对象的顺序一致,而析构函数的调用顺序与构造函数的调用顺序完全相反。,返回,3.3 深拷贝与浅拷贝,通常,如果一个类包含指向动态存储空间指针类型的数据成员,并且通过该指针在构造函数中动态申请了空间,则必须为该类定义一个拷贝构造函数,否则在析构时容易出现意外错误。 对example3_13.cpp在VC+下编译,再按照教材中的方法修改并运行,分析原因。,指针悬挂,析构时,浅拷贝,返回,specia

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号