第7章 类与对象
7-1. 教学目的与要求
1.理解类、类的成员、类的对象等概念;并掌握类、类的成员的定义方法及类对象的创建方法;
2.理解构造函数和析构函数的概念,掌握构造函数和 析构函数定义方法,掌握构造函数的各种使用方法; 3.理解对象成员的概念,掌握对象成员的初始化方法;
4.掌握coust对象、 coust成员函数和coust成员数据的使用; 5.掌握友元函数的定义和使用;
6.掌握静态成员数据及静态成员函数的义及使用。
7-2.主要内容及重点:
本章主要介绍类的定义和使用以及类中各种特殊类型的成员的定义及用法,包括类及其成员的定义、对象的创建和使用、*this指针,成员函数、构造函数、析构函数、对象成员、友员、静态成员等。
类是面向对象系统中最重要要的概念,面向对象程序设计中的所有操作都可归结为对类的操作。类是实现C++面向对象程序设计的基础,是软件开发方法发展的必然产物。
本章的重点是:类的定义和使用,以及各种类型的成员数据的定义和使用,各种类型的成员函数的定义和使用,构造函数和析构函数,友元函数等。
本章的难点是:构造函数的两类特殊用途、const对象和const成员、静态成员等。 7-3. 第7章 类与对象-课件
3-4. 第7章 类与对象-复习总结
本章首先介绍了类和对象的基本概念和特性,使初学者对类有了一个总体的
认识。
类是面向对象程序设计的基础。在进行面向对象程序设计时,必须习惯于将事物或问题的描述抽象为类。
类是对某一类事物的描述。类中包含了数据成员和成员函数。它们表现了
1
该类所具有的属性(数据)和操作(函数)。类的一个实例称为对象。对象是具有类类型的变量。对象中的公有成员函数是对象与外界进行信息交换的唯一接口。
其次进一步学习了类中各种类型成员的定义及使用。
1.类的成员函数与一般函数一样,函数的参数可以具有默认值,并可以进行函数的重载。但成员函数具有类的作用域,即只能通过类的对象访问其公有成员函数。
2.在创建对象时,自动调用类的构造函数,因此构造函数提供了对成员函数进行初始化的一种手段。析构函数则是在对象被撤消时自动调用,它主要用于对象的一些善后处理工作。构造函数和析构函数为类的两个特殊的成员函数:它们都于类同名、不能指定返回值类型,一般访问权限为公有类型。如果不显式定义它们,C++将提供默认的构造函数和析构函数。
3.可以将一个类的对象作为另一个类的成员数据,成为对象成员。对象成员的初始化,必须借助于该类的构造函数通过初始化成员列表来完成。
4.为了能够共享数据又保护数据不被改变,可以将对象成员声明为const对象或const成员。const对象或const成员在使用上有许多特殊规定。
5.当创建多个对象时,静态成员能够节省内存空间。它属于类,不属于某个对象,它为所有同类的对象所共享。
6.友员提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友员,一个普通函数或另一个类的成员函数可以访问其他类中的私有和保护成员。
7-5. 第7章类与对象-练习
7-5-1.思考题:
1).什么是类?类的一般形式是什么? 2).比较C++中的结构和类的异同。
3).什么是对象,类和对象之间有什么样的关系? 4).对象能够访问什么类型的成员?如何访问?
5). *this指针具有什么样的特殊性?在编程过程中如何使用*this指针? 6).在类中是如何实现封装性的?
7). 构造函数与析构函数分别有什么用?为什么允许构造函数重载而不允许析构函数重载。
8). 如何实现对象成员的初始化?试举例说明。
9). const对象具有什么特征?在使用const对象时的注意点是什么?
10). 如何声明一个友元函数?一个类的友元函数是如何访问该类的成员的? 11). 静态成员数据具有什么特征?在什么情况下使用静态成员数据? 12). 静态成员函数具有什么特征?在定义静态成员函数时要注意什么?
7-5-2.练习题:
课后练习题见练习单元。
2
第7章 类与对象课件
7.1 类和对象 7.1.1类
类:是对一组具有公共属性的事物的抽象,从语言角度讲,它是一种自定义的数据类型,其中既包含有描述其属性的数据,又有处理这些数据的操作(函数),
7.1.1.1类的定义
类的格式 与结构(struct)类似。一般格式如下: class<类名>{ 《 《private::》
〈私有成员数据和成员函数〉;》 《 public:
〈公有成员数据和成员函数〉;》 《protected:
〈保护成员数据和成员函数〉》 }; 其中:
1) class是定义类的关键字; 2)〈类名〉为一个合法的标识符,是类的命名。
3)类体:一对大括号内的说明部分。类体后面有个分号,表示类体的结束。 4)类的成员:类体中定义的数据和函数。称为:成员数据和成员函数。
5)private:限定的成员为私有成员。私有成员只限定在该类的内部使用。即只允许该类中的成员函数访问私有的成员数据和私有的成员函数。
punlic:限定的成员称为公有成员。可以被类中的成员函数和类外的函数使用(访问—对数据或调用—对函数)。
protected:限定的成员称为保护成员,对保护成员的访问要求与私有成员类似,只是在有派生类时与私有成员不同。
6)private、public、protected在类中的顺序无关紧要的,同一个关键字在类体中可以被反复使用。
7)private为默认关键字,在类体中没有明确地指定成员的访问权限时,系统约定这些成员为私有成员。
8)限定访问权限的关键字的限定范围为:从该关键字后的第一个成员开始,到下一个限定访问权限的关键字之间的所有的成员。
9)在定义类时,类的成员顺序也是无关紧要的,可先定义成员数据,也可以先定义成员函数,也可以混在一起定义,此时在前面定义的成员函数可以访问在后面定义的成员,在后面
3
定义的成员函数也可以访问在前面定义的函数。但为了使定义的类清晰易懂,通常将成员数据集中在一起定义。
10)类可以嵌套定义,见下例。
例如:7.1.1 定义一个表示日期的类 class CDate {
private : //
int year , month , day ; public:
void SetDate (int y , int m , int d) {
year = y ; month = m; day = d ; }
void Print ( ) {
cout< 例如:类的嵌套,在一个类体中可以定义另一个类,这一点与函数不同。 class COuter { class CInner { int i ; } ; CInner x ; } ; 7.1.1.2类的构成 类的成员的定义: 1.类的数据成员定义:通常都在类体内定义,它的定义方式和变量的定义方式相同。 类的数据成员可以是基本数据类型、导出数据类型或指针类型,也可 以是用户自定义类型。 2.类的成员函数: 1)定义与一般的函数类似,可有参数和返回类型, 2)其函数体可以在类体内定义也可以在类体外定义,这两种定义方式使用效果相同。在类体内实现的成员函数都是内联函数(见第3章),称为内联成员函数,在类体外实现的成员函数称为外联成员函数,不是内联函数,但可以在函数实现时在其函数名前加上关键字inline来表示该函数是内联成员函数。 3)一般来说,一个类必须至少有一个公有成员函数,否则该类不能与外界交互。 4)类的成员函数也称为消息,根据访问权限的不同,可将其分为公有消息和私有消息。私有和保护成员函数只能被类的成员函数或友员函数访问,称它们为私有消息;公有成员函 4 数不仅可以被内部成员访问,而且能够被外部成员访问,则称它们为公有消息。对于一个具有封装性的类,主要通过公有消息与外界交互。 3.定义类时,只是定义了一种数据类型,此时并没有给所定义的类分配存储空间,因此这时不能对类中的成员数据初始化。 由于类的定义,是将一些数据和函数封装在一个统一的体中,所以所以类的成员数据不能使用关键字extern、auto以及register等(static除外)来限定其存储类型。 例如: class CDate { { int year = 2002 , month = 1 ; //错误,不能对类定义中的数据成员初始化 register int day ; //错误,不能限定类中数据成员的存储类型 --- } ; 4.类中的成员具有类作用域: 类中的成员的有效范围为整个类体,它们能供类中的成员函数访问,类中的成员函 数可以访问类中的任何成员,且不受位置的限制,即在类中先定义的成员函数可以访问后定义的其他成员。 5.在类体外定义成员函数,一定要在成员函数前加上“类名::”, (::称为作用域运算符或作用域限定符) 例7.1.2 在类体外实现成员函数的定义。 class CDate { public : void SetDate ( int y , int m , int d ) //在类体内实现的函数,为内联函数 { year = y ; month = m ; day = d ; } void Print ( ); int IsLeapYear ( ); private : int year , month , day ; } ; void CDate ::Print ( ) { cout< inline int CDate ::IsLeapYear ( ) //在类体外定义内联函数 { return ( year%4= = 0&&year0!=0)||(year@0= =0 ); } 7.1.2 类的使用 5