140 likes | 250 Views
主要内容: 1 、类的声明和对象的定义; 2 、构造函数与析构函数; 3 、类数据成员和类成员函数; 4 、指向对象的指针;. 类和对象. 内建的类 : 如 string,ifstream,ofstream ; 类声明 (class declaration) ---- 创建类并且将类当作数据类型来使用。 类是一种用户自定义类型,定义形式: class 类名称 { public: 外部接口 protected: 保护型成员 private: 私有成员 }. struct 类名称 { public: 外部接口
E N D
主要内容: 1、类的声明和对象的定义; 2、构造函数与析构函数; 3、类数据成员和类成员函数; 4、指向对象的指针;
类和对象 • 内建的类: 如string,ifstream,ofstream; • 类声明(class declaration) ----创建类并且将类当作数据类型来使用。 类是一种用户自定义类型,定义形式: • class 类名称 • { • public: • 外部接口 • protected: • 保护型成员 • private: • 私有成员 • } • struct 类名称 • { • public: • 外部接口 • protected: • 保护型成员 • private: • 私有成员 • }
class Date { public: void setDate( int y,int m,int d){year=y;month=m;day=d;} int IsLeapYear() {return(year%4==0&&year%100!=0)||(year%400==0);} void PrintDate(){cout<<year<<month<<day<<endl;} private: int year,month,day; }; Date date1, date2, date[10]; 在C++中,以类作为数据类型定义的变量就是对象。 类声明描述了封装在类中的数据成员和成员函数。
数据成员 • 与一般的变量定义相同,但需要将它放在类的定义体中。 • 只有类型说明,无存储类说明,即把类的数据成员说明为auto、register和extern是无意义的 • 其类型可以是基本数据类型和复杂数据类型,或已定义好的类对象。例如 class N{ class M{ public: public: //… //… }; private: N n; } 对象成员
成员函数 • 在类中说明原型,在类外定义函数体实现,并在函数名前使用类名加以限定。也可以直接在类中定义函数体,形成内联成员函数。 • 允许定义重载函数和带缺省形参值的函数 class point { int i,j,k; public: point() {i=j=k=0;} point(int I=6,int J,int K) { i=I; j=J; k=K; } void print(const char* msg=" ") const { if(*msg) cout<<msg<<endl; cout<<"i="<<i<<"," <<"j="<<j<<"," <<"k="<<k<<endl; } };
C++的信息隐藏机制 在类中可以包含以下三种类型的数据和函数成员: • 私有类型(private) • 公有类型(public) • 保护类型(protected) Private: 在关键字private后面声明,如果省略关键字private,那么必须紧跟在类的名称后面声明。 私有类型的成员只允许本类中的函数访问,而类外部的任何函数都不能访问。
Public: 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 Protected: 与private类似,其差别表现在继承与派生时对派生类的影响不同
成员选择符 成员选择符.和指针操作符–>用来实现对类的数据成员和成员函数进行访问。 成员选择符 . 出现在类对象和类成员之间,用来访问数据成员和成员函数,但对象的使用者只能访问类的公有成员。 指针操作符–>出现在类对象指针和类成员之间。 • 类范围 类的私有成员具有的性质,即类的私有成员仅由类的成员函数访问,公有成员可在类之外进行访问。 class声明的类,其类成员在默认情况下具有类范围性质。
class和struct的区别 使用class,类成员在默认状态下是私有的; 使用struct,类成员在默认状态下是公有的。 class person { int age; //默认隐藏的数据成员 public: void setage(int n); //指明暴露 int getage() const; //不改变数据成员 private: char name[20]; //指明隐藏 };
类成员函数的定义 • 成员函数的定义可在类声明之中进行,也可在类声明之外定义 • 成员函数在类声明之中进行定义,这种定义方式为内联(incline),内联定义同时提供了成员函数的声明和定义。 • 通过incline声明成员函数时,可将原本定义在类声明之外的函数强制变成内联函数。 • 编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。
注意: • 内联函数体内(最好)不要有循环语句和switch语句。 • 内联函数的定义必须出现在内联函数第一次被调用之前。 • 例见313。 • 类的使用 使用类的关键步骤: 类声明、对象定义以及客户服务请求 例见314。
例313 #include <iostream.h> class point { int i,j,k; public: point() {i=j=k=0;} point(int I,int J,int K) { i=I; j=J; k=K; } void print(const char* msg=" ") const { if(*msg) cout<<msg<<endl; cout<<"i="<<i<<"," <<"j="<<j<<"," <<"k="<<k<<endl; } }; void main() { point p,q(1,2,3); p.print("values of p"); q.print("values of q"); }
#include <iostream.h> class Watch {public: void SetTime(int NewH=0,int NewM=0, int NewS=0); void ShowTime(); private: int Hour, Minute, Second; }; void Watch::SetTime(int NewH,int NewM,int NewS) { Hour=NewH; Minute=NewM; Second=NewS; } void Watch::ShowTime() { cout<<Hour<<":"<<Minute<<":"<<Second<<endl; } void main() { Watch myWatch; //定义对象 myWatch.SetTime(); //按默认值设置 myWatch.ShowTime(); myWatch.SetTime(8,30,30); myWatch.ShowTime(); } 例314
堆栈类 • 问题的提出 • 举例说明 • 解决方案 • 类的实现 • 自己看书