《《C++面向对象程序设计》教案.docx》由会员分享,可在线阅读,更多相关《《C++面向对象程序设计》教案.docx(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+面向对象程序设计教案 第3章类和对象3.2 构造函数与析构函数 例:点类 Point class Point private: int x,y; public: Point() ; Point(int xx, int yy) x=xx; y=yy; Point(Point &p) x=p.x; y=p.y; int GetX() const return x; int GetY() const return y; void SetXY(int xx, int yy) x=xx; y=yy; void Show(); ; void Point:Show() cout”操作符。 3、this指
2、针 C+为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当通过一个对象调用一个成员函数时,系统就自动把这个this指针指向该对象。因此使用的数据成员就是该对象的数据成员。 3.4 向函数传递对象 1、使用对象作为函数参数 2、使用对象指针作为函数参数 3、使用对象引用作为函数参数 3.5 静态成员 1、静态数据成员 在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员。与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享。 定义静态数据成员的格式如下: static 数据类型数据成员名; 静态
3、数据成员在该类定义之外被初始化。访问静态数据成员可以通过对象或指针来访问,也可以通过类名:来访问。 2、静态成员函数 定义静态成员函数的格式如下: static 返回类型静态成员函数名(参数表); 与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种: 类名:静态成员函数名(实参表) 对象. 静态成员函数名(实参表) 对象指针-静态成员函数名(实参表) 例:点类 Point(演示静态成员) class Point private: int x,y; static int count; public: Point(int xx=0, int yy=0) x=xx; y=yy; count
4、+; Point(Point &p) x=p.x; y=p.y; count+; int GetX() const return x; int GetY() const return y; void SetXY(int xx, int yy) x=xx; y=yy; static int GetCount() return count; ; int Point:count=0; int main() Point a(100,200), b; cout=0 ? r : 0); void SetValue(int x, int y, double r) center.SetXY(x,y); Set
5、Radius(r); double Area(); void Show(); ; const double PI=3.14159; inline double Circle:Area() return PI * radius * radius; void Circle:Show() cout=0 ? r : 0); void SetValue(int x, int y, double r) SetXY(x,y); SetRadius(r); double Area(); void Show(); ; const double PI=3.14159; inline double Circle:A
6、rea() return PI * radius * radius; void Circle:Show() cout圆心为: Point:Show(); cout半径为: radius; 关于基类和派生类的几点说明 1、派生类继承了它的所有基类中除构造函数和析构函数之外的所有成员。 2、在派生类中成员按访问属性划分为四种:不可访问的成员、私有成员、保护成员、公有成员。 3、对从基类继承下来的成员初始化工作是通过调用基类的构造函数来完成的,调用方法是在派生类的构造函数中用初始化列表。 4、如果在派生类的构造函数省略了基类的初始化列表,则将调用基类的缺省构造函数。 5、如果基类定义了带有参数的构造
7、函数时,派生类就应当定义构造函数,以便显式地调用基类的构造函数。 6、如果派生类定义了与基类同名的新数据成员或成员函数,则此派生类的成员就覆盖了基类的同名成员,直接使用成员名只能访问到派生类的成员。 7、在同名覆盖的情况下,可以使用基类名+作用域分辨符来访问基类的同名成员。 8、如果派生类和基类的某个成员函数重名,但参数表不同,仍然属于覆盖,不属于重载。 9、对派生类的对象,构造函数的执行过程是:先调用基类的构造函数(按它们被继承时声明的顺序),再调用内嵌对象成员的构造函数(按内嵌对象声明的顺序),最后执行自己的构造函数体中的内容。 10、析构函数的调用次序正好和构造函数的调用次序相反。 例:
8、学生类 Student /student.h #include person.h class Student: public Person protected: char *Department; int Number; public: Student() Department = 0; Number = 0; Student(char *, int, char, char *, int); Student(Student &stu); Student() delete Department; void SetDep(char*); void SetNum(int num) Number =
9、num; char *GetDep() const return Department; int GetNum() const return Number; void Show(); ; /student.cpp #include student.h #include using namespace std; Student:Student(char *name,int age,char sex,char *dep,int num) : Person(name, age, sex) Department = new charstrlen(dep)+1; strcpy(Department, d
10、ep); Number = num; Student:Student(Student &stu): Person(stu) Department = new charstrlen(stu.Department)+1; strcpy(Department, stu.Department); Number = stu.Number; void Student:SetDep(char *dep) delete Department; Department = new charstrlen(dep)+1; strcpy(Department, dep); void Student:Show() Per
11、son:Show(); coutDepartment: Department, Number: Numberendl; 4.4 多重继承 例1:X和Y是基类,Z从X和Y派生 class X public: int b; X(int k) b=k; ; class Y public: int c; Y(int k) c=k; ; class Z: public X, public Y public: int d; Z(int i,int j,int k):X(i),Y(j) d=k; 例2:X和Y都从W派生而来 class W public: int a; W(int k) d=k; ; class X: public W public: int b; X(int i, int k): W(i) b=k; ; class Y: public W public: int c; Y(int i, int k): W(i) c=k; ; class Z: public X, public Y public: int d; Z(int i, int j, int k, int l): X(i,j),Y(i,k) d=l;
限制150内