第九章类和对象

  • 格式:doc
  • 大小:167.00 KB
  • 文档页数:29

类与对象传统的结构化语言都是采用面向过程的方法来解决问题。

在面向过程的程序设计方法中,代码和数据是分离的,因此,程序的可维护性较差。

面向对象(Object Oriented)程序设计方法则是把数据及处理这些数据的函数封装到一个类中,类是C++的一种数据类型,而使用类的变量则称为对象。

函数是将逻辑上有关的语句和数据集合在一起,主要用于执行;而类则是逻辑上有关的函数及其数据的集合,它主要不是用于执行,而是提供所需要的资源。

1.类的定义在使用一个类之前必须先定义类。

例如在C语言里声明一个结构体类型:struct student{ int numchar name[10];char sex;};struct student student1, student2;现在我们声明一个类:class stud // 以class开头{ int numchar name[10];char sex; // 以上3行是数据成员void display() // 这是成员函数{ cout<<”num:”<<num<<endl;cout<<”name:”<<name<<endl;cout<”sex:”<<sex<<endl;} // 以上4行是操作代码};stud stud1, stud2; // 定义了两个stud类的对象定义一个类的语法格式如下:class 类名:基类名{private:私有成员数据及函数;protected:保护成员数据及函数;public:公共成员数据及函数;}[类的对象声明];一个类含有私有成员(private)、保护成员(protected)和公共成员(public)三部分。

默认时在类中定义的项都是私有的。

私有变量和函数只能被该类本身的成员函数存取或调用;保护成员除可以被本类中的成员函数访问外,还可以被本类派生的类的成员函数访问,因此用于类的继承;公共成员可以被本类以外的函数访问,是类与外部的接口。

类是面向对象程序设计最基本的单元,在设计面向对象程序时,首先要以类的方式描述实际待解决的问题,也就是将问题所要处理的数据定义成类的私有或公共类型的数据,同时将处理问题的方法定义成类的私有或公有的成员函数。

类也可以嵌套声明。

对象对象是声明为类类型的一个数据项,是类的实际变量,有时也称为类的实例(Instance)。

方法:类中的成员函数称为“方法”,“方法”是对数据的操作。

方法的具体实现既可以在类的定义内部完成,也可以在类的定义之外进行,而且方法的具体实现既可以和类的定义放在同一个源文件中,也可以放在不同的源文件中。

消息:外界是通过发“消息”来激活有关方法的。

所谓“消息”,其实就是一个命令,由程序语句来实现。

例如想输出对象stud1中的学生学号、姓名、性别等信息,可以在程序中写stud1.display();这就是向对象stud1发出的一个“消息”,通知它执行display“方法”。

例 1-1 : Lt1-1.cpp# include <iostream.h># include <math.h>const double ANG_TO_RAD=0.0174532925;// 定义弧度和度之间的转换比例,即弧度的值class angle // 定义类angle{ double value; // 类angle的私有数据成员public: // 类angle的公共数据成员void SetValue(double);double GetSine(void);}deg; // 声明类angle的对象degvoid angle::SetValue(double a) //类angle的成员函数SetValuede的具体实现{ value=a;}double angle::GetSine(void) //类angle的成员函数GetSine 的具体实现{ double temp;temp=sin(ANG_TO_RAD*value);return temp;}void main(){ deg.SetValue(60.0); // 给类angle的成员变量Value赋值cout<<"The sine of the angle is:";cout<<deg.GetSine()<<endl; // 输出正弦值}运行结果为:The sine of the angle is:0.866025又例:# include <iostream.h># include <math.h>const double ANG_TO_RAD=0.0174532925;// 定义弧度和度之间的转换比例,即弧度的值class angle // 定义类angle{double value; // 类angle的私有数据成员public: // 类angle的公共数据成员void SetValue(double);double GetSine(); // void可以不要}deg; // 声明类angle的对象degvoid angle::SetValue(double a) // 类angle的成员函数SetValuede 的具体实现{ value=a;}double angle::GetSine() // 类angle的成员函数GetSine 的具体实现{ double temp;temp=sin(ANG_TO_RAD*value);return temp;}void main(){ deg.SetValue(60.0); // 给类angle的成员变量Value赋值cout<<"The sine of the angle is:";cout<<deg.GetSine()<<endl; // 输出正弦值}运行结果为:The sine of the angle is:0.8660252.内联函数调用函数时需要一定的时间,如果有的函数需要频繁使用,则所用时间会很长,从而降低程序的执行效率。

C++提供一种提高效率的方法,即在编译时将调用函数的代码嵌入到主调函数中。

这种嵌入到主调函数中的函数称为“内联函数”(inline function),又称“内嵌函数”或“内置函数”。

例 1-2 : Lt1-2.cpp# include <iostream.h>inline int max(int a, int b, int c) //这是一个内联函数,求3个整数中的最大者{ if (b>a) a=b;if (c>a) a=c;return a;}void main(){ int i=7, j=10, k=25, m;m=max(i,j,k);cout<<"max= "<<m<<endl;}运行结果为:max= 25类的方法也可以声明和定义成内联函数。

可以使用下面两种格式定义类的内联函数:(1)把函数原型声明和方法的定义合并,放入类定义中。

例 1-3: Lt1-3.cpp# include <iostream.h># include <math.h>const double ANG_TO_RAD=0.0174532925;class angle // 定义类angle{ double value, temp; // 定义私有数据成员public:double GetSine(double a) // 定义内联函数{ value=a;temp=sin(ANG_TO_RAD*value);return temp;}}deg;void main(){cout<<"The sine of the angle is: ";cout<<deg.GetSine(60.0)<<endl;}运行结果为:The sine of the angle is: 0.866025(2)当在函数的外部定义时,把关键字inline加在函数定义之前。

例 1-4 : Lt1-4.cpp# include <iostream.h># include <math.h>const double ANG_TO_RAD=0.0174532925;// 定义弧度和度之间的转换比例,即弧度的值class angle // 定义类angle{ double value; // 类angle的私有数据成员public: // 类angle的公共数据成员void SetValue(double);double GetSine(void);}deg; // 声明类angle的对象deginline void angle::SetValue(double a) // 定义内联函数{ value=a;}inline double angle::GetSine(void) // 定义内联函数{ double temp;temp=sin(ANG_TO_RAD*value);return temp;}void main(){ deg.SetValue(60.0); // 给类angle的成员变量Value赋值cout<<"The sine of the angle is:";cout<<deg.GetSine()<<endl; // 输出正弦值}运行结果为:The sine of the angle is:0.8660253.构造函数和析构函数构造函数在建立一个对象时,常常需要做某些初始化的工作(例如对数据赋予初值),C++提供了一种特殊的成员函数----构造函数(constructor)。

这种函数与其他成员不同,不需要用户发“消息”来激活它,而是在建立对象时自动执行。

构造函数是由用户定义的,它必须与类名同名,以便系统能识别它并把它作为构造函数。

下面是一个不带构造函数的类:class stud // 以class开头{ int numchar name[10];char sex; // 以上3行是数据成员void display() // 这是成员函数{ cout<<”num:”<<num<<endl;cout<<”name:”<<name<<endl;cout<”sex:”<<sex<<endl;} // 以上4行是操作代码};stud stud1; // 定义了两个stud类的对象现在我们在其中加入构造函数:class stud // 以class开头{ int num;char name[10];char sex; // 以上3行是数据成员public:stud() // 定义构造函数,函数名与类名相同{ num=10010;strcpy(name,”Wang_li”);se x=’F’;} // 以上3行为给数据赋初值void display() // 定义成员函数{ cout<<”num:”<<num<<endl;cout<<”name:”<<name<<endl;cout<<”sex:”<<sex<<endl;} // 以上3行是操作代码};stud stud1; // 在定义对象stud1时自动执行构造函数构造函数不需用户调用,而是在定义一个对象时由系统自动执行,而且只能执行一次。