13.1.1 类的声明
在C++(www.cppentry.com)中,新的数据类型可以用Class来构造。类的声明语法与C语言中的Struct声明类似,只是Class还包含函数声明。
【示例13-1】 定义point类。
- class point
- {
- int x,y; //数据
- public: //访问规则
- void setpoint(int,int); //数据上的操作
- }
分析:该示例声明了一个名为point的类。它包含了数据为x、y,还包含了一个名为setpoint()的函数。函数被public关键字说明为公有的,数据没有被说明,但默认也为公有的。
下面再以一个更完整的示例进一步来说明类的声明方法。
【示例13-2】 声明一个简单的student学生类。
- class student
- {
- private: //访问规则
- int id; //学号
- char* name; //姓名
- float chinese,english,math; //语文、英语、数学三门课程成绩
- public: //访问规则
- student(); //构造函数
- student(int,char *,float,float,float);
- //构造函数,设置学号,姓名,三门课程成绩
- ~student(); //析构函数
- void setid(int); //设置学号
- void setname(char *); //设置姓名
- void setscore(float,float,float); //设置课程分数
- float sum(); //求三门课程总分
- float average(); //求三门课程平均分
- }
分析:在这个类中,共有4个数据,分别是id、name、chinese、english、math,用于记录学生的学号、姓名和三门课程的成绩。它们被关键字private说明为私有的,即这些数据只能被类的成员函数和友元函数(参见13.1.7节)访问。
类中声明了8个函数,用关键字public说明为公有的。第1个函数是构造函数,负责构造类对象,在定义对象时由系统自动调用。第2个函数也是构造函数,但是与第1个的形式不一样,它带了参数。这属于重载现象,本书后面的章节中有专门讲解。构造函数的名字必须和类的名字相同。
第3个函数是析构函数,标志是前面有一个'~'符。该函数在销毁对象时自动被调用,负责对象销毁后的善后工作。析构函数必须是类的名称前加'~'符。第4、5、6这3个函数负责私有属性的访问。因为属性是私有,所以只有通过student类提供的这3个函数才能从类的外部访问到它们。最后2个函数负责具体的计算工作,分别计算求总分和求平均分。
除了该示例中的限定符public和private外,还有一个限定符是protected。它们都用来支持信息的隐藏机制,将类的成员分成了3类:公有成员、私有成员和保护成员。
公有成员(包括类的属性和方法):提供了类的外部界面,它允许类的使用者来访问它。
私有成员(包括类的属性和方法):只能被该类的成员函数访问,也就是说只有类本身能够访问它,任何类以外的函数对私有成员的访问都是非法的。当私有成员处于类声明中的第一部分时,此关键字可以省略。
保护成员:对于派生类来说,保护成员就像是公有成员,可以任意访问。但对于程序的其他部分来说,就像是私有成员,不允许被访问。
假设程序中有一个函数,它直接访问并操作某类的数据成员,一旦该类的数据成员被修改或者被删除,那么这个函数很可能需要被重写。如果程序中存在大量这样的函数,就会增加软件的开发和维护成本。此时,可以通过访问限定符将类的数据成员定义为私有成员,然后在类中定义一个公有的成员函数,访问并操作类中的私有属性。这样程序中的函数无法直接访问私有的数据,只有通过公有成员函数才能访问并且操作它们。
例如,为了能够访问student类中的语文成绩,需要增加一个公有的成员方法getchinese()。如果类中的数据成员被修改,那么只需要修改相应的公有成员方法,而不必改动程序中的函数。
【示例13-3】 增加成员chinese的访问函数。
- class student
- {
- private:
- float chinese; //私有属性
- public:
- float getchinese() //私有成员chinese的访问函数
- {
- return chinese
- }
- }
分析:该类声明了一个私有数据,用来记录语文成绩。由于是私有的,所以不能从外部访问,必须通过公有函数getchinese()来访问。
| 回书目 上一节 下一节 |