类和对象的更多内容

上传人:san****019 文档编号:70232324 上传时间:2019-01-16 格式:PPT 页数:61 大小:667.51KB
返回 下载 相关 举报
类和对象的更多内容_第1页
第1页 / 共61页
类和对象的更多内容_第2页
第2页 / 共61页
类和对象的更多内容_第3页
第3页 / 共61页
类和对象的更多内容_第4页
第4页 / 共61页
类和对象的更多内容_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《类和对象的更多内容》由会员分享,可在线阅读,更多相关《类和对象的更多内容(61页珍藏版)》请在金锄头文库上搜索。

1、第2章 类和对象的更多内容,课件制作,2,主要内容,实例成员和静态成员 析构函数 拷贝构造函数 调用构造函数和析构函数的顺序 对象与函数 无名对象 友元函数和友元类 实例研究 小结和作业,课件制作,3,2.1 实例成员和静态成员,实例变量 与类的特定对象联系在一起; 同一个类的不同对象,实例变量数据域是不同的,而且也不共享,课件制作,4,2.1 实例成员和静态成员,静态数据成员 在不使用全局对象的情况下,如果希望一个类的所有对象共享某些数据成员,可以通过声明该数据成员为静态存储类型来实现 静态数据成员是一种特殊的数据成员,它以关键字static 开头 静态数据成员的值在各对象中是一样的,它为各

2、对象所共有,而不只属于某个对象的成员,class Circle public: Circle(); Circle(double r); double getArea(); int getNumberOfObjects(); private: double radius; static int numberOfObjects; ;,课件制作,5,2.1 实例成员和静态成员,/file: Circle.h class Circle public: Circle(); Circle(double); double getArea(); double getRadius(); void setRadi

3、us(double); int getNumberOfObjects(); private: double radius; static int numberOfObjects; ;,/file: Circle.cpp #include “Circle.h“ const double PI=3.1415926; int Circle:numberOfObjects = 0; / Construct a circle object Circle:Circle() radius = 1; numberOfObjects+; / Construct a circle object Circle:Ci

4、rcle(double radius) this-radius = radius; numberOfObjects+; / Return the area of this circle double Circle:getArea() return radius * radius * PI; ,/ Return the radius of this circle double Circle:getRadius() return radius; / Set a new radius void Circle:setRadius(double radius) this-radius = (radius

5、 = 0) ? radius : 0; / Return the number of circle objects int Circle:getNumberOfObjects() return numberOfObjects; ,静态成员初始化,静态成员访问,课件制作,6,2.1 实例成员和静态成员,/file:CircleTest.cpp #include using namespace std; #include “Circle.h“ int main() Circle circle1; cout “The area of the circle of radius “ circle1.ge

6、tRadius() “ is “ circle1.getArea() endl; cout “Number of circle objects created: “ circle1.getNumberOfObjects() endl; Circle circle2(5.0); cout “The area of the circle of radius “ circle2.getRadius() “ is “ circle2.getArea() endl; cout “Number of circle objects created: “ circle2.getNumberOfObjects(

7、) endl; circle1.setRadius(3.3); cout “The area of the circle of radius “ circle1.getRadius() “ is “ circle1.getArea() endl; cout “circle1.getNumberOfObjects() returns “ circle1.getNumberOfObjects() endl; cout “circle2.getNumberOfObjects() returns “ circle2.getNumberOfObjects() endl; return 0; ,课件制作,

8、7,2.1 实例成员和静态成员,静态数据成员 静态数据成员是在程序编译时被分配空间,到程序结束时才释放空间 静态数据成员可以初始化,但只能在类体外进行初始化 使用静态数据成员的目的是节约空间,提高效率 静态数据成员与实例的关系 静态数据成员在内存中只占一份空间,每个对象都可以引用这个静态数据成员 静态数据成员的值对所有对象都是一样的;如果改变它的值,则在各对象中这个数据成员的值都同时改变 静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间;静态数据成员是在所有对象之外单独开辟空间。 静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放。,课件制作,8,2.

9、1 实例成员和静态成员,静态数据成员 静态数据成员初始化的一般形式为: 数据类型 类名静态数据成员名=初值; 不必在初始化语句中加 static 公有静态数据成员既可以通过对象名引用,也可以通过类名来引用 有了静态数据成员,同一个类各对象之间的数据有了沟通的渠道,实现数据共享,因此可以不使用全局变量。全局变量破坏了封装的原则,不符合面向对象程序的要求,int Circle:numberOfObjects = 0;,Circle circle2(5.0); cout “Number of circle objects created: “ circle2.numberOfObjects endl

10、; cout “Number of circle objects created: “ Circle:NumberOfObjects endl;,课件制作,9,2.1 实例成员和静态成员,静态成员函数 成员函数也可以定义为静态的,在类中声明函数的前面加 static 就成了静态成员函数 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分 静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员 在C+程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员,class Circle public: Circle(); Circle(double); doubl

11、e getArea(); double getRadius(); void setRadius(double); static int getNumberOfObjects(); private: double radius; static int numberOfObjects; ;,课件制作,10,2.1 实例成员和静态成员,/ 静态成员的应用 / file: Student.h #include using namespace std; class Student /定义Student类 public: Student(int n, string name, float s):num(n

12、), strName(name),score(s) /定义构造函数 void Total( ); static float Average( ); /声明静态成员函数 private: int num; string strName; float score; static float sum; /静态数据成员 static int count; /静态数据成员 ;,课件制作,11,2.1 实例成员和静态成员,/ Student.cpp #include “Student.h“ /对静态数据成员初始化 float Student:sum=0; int Student:count=0; /非静态

13、成员函数实现 void Student:Total( ) sum+=score; /累加总分 count+; /累计已统计的人数 /定义静态成员函数 float Student:Average( ) return(sum/count); ,课件制作,12,2.1 实例成员和静态成员,/ StudentTest.cpp #include using namespace std; #include “Student.h“ int main( ) /定义对象数组并初始化 Student stud3=Student(1001,“aaa“,70), Student(1002,“bbb“,78), Stu

14、dent(1005,“ccc“,98) ; int n; coutn; /输入需要求前面多少名学生的平均成绩 for(int i=0;in;i+) /调用n次total函数 studi.Total( ); cout“The average score of “n“ students is “ Student:Average( )endl; /调用静态成员函数 return 0; ,课件制作,13,2.1 实例成员和静态成员,静态成员函数 在Student类中定义了两个静态数据成员sum(总分)和count(累计需要统计的学生人数),这两个数据成员的值是需要进行累加的,它们并不是只属于某一个对象

15、元素,而是由各对象元素共享 Total() 是公有的成员函数,可以引用本对象中的一般数据成员(非静态数据成员),也可以引用类中的静态数据成员 Average() 是静态成员函数,它可以直接引用私有的静态数据成员(不必加类名或对象名),函数返回成绩的平均值 主程序中引用Total() 函数要加对象名,引用静态成员函数Average() 函数要用类名或对象名,如果不将 Average 函数定义为静态成员函数行不行?程序能否通过编译? 为什么要用静态成员函数?请分析其理由,课件制作,14,2.1 实例成员和静态成员,静态成员函数 如果在类外调用公用的静态成员函数,要用类名和域运算符“” 静态成员函数

16、原则上不允许引用本类非静态数据成员,coutStudentAverage( )endl; /调用静态成员函数,课件制作,15,2.2 析构函数,析构函数(destructor)也是一个特殊的成员函数,其名字是类名的前面加一个“”符号 析构函数没有返回类型和参数 当对象销毁时,析构函数被自动调用 它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数 如果程序员没有显式定义析构函数,C+编译系统会自动为每一个类定义一个默认的析构函数,但它只是徒有析构函数的名称和形式,实际上什么操作都不进行 一般情况下,类的设计者应当在声明类的同时定义析构函数,以指定如何完成“清理”的工作,class Circle public: Circle(); Circle(double); Circle(); double getArea(); d

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

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

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