第4章面向对象基本概念与类实训
类(class)是用户定义的一种新的数据类型,本章将通过做习题和上机实验,学会怎样定义简单的类。
4.1 典型习题解答
【例4.1】解释类和对象有什么区别?
【解答】对象是描述客观事物的一个实体,它是构成信息系统的一个基本单位。对象由对象名、一组属性和一组操作构成,属性由数据表示,操作由函数实现。类实质上是定义了一种对象类型,它描述了属于该类型的所有对象的属性和操作。对象是类的实例。
【例4.2】写出类定义的语法结构。
【解答】
class <类名> {
private:
<私有的数据和函数>
protected:
<保护的数据和函数>
public:
<公有的数据和函数>
};
类的定义包括了4部分:
⑴关键字class和类名,类名是程序员为类起的名字,可以用除关键字以外的任何字符串表示;
⑵左花括号‘{’;
⑶声明数据和函数,数据就是用类型说明C++变量,函数就是一般的C++函数;
⑷右花括号‘}’和分号‘;’。
【例4.3】 C++关键字private和public有什么作用?
【解答】公有成员用public关键字声明,它定义了类的外部接口。私有成员用private 关键字声明,它定义了类的内部使用的数据和函数。
【例4.4】公有成员和私有成员有什么区别?
【解答】只有公有成员才能被用户程序直接访问,私有成员只能被自己所属类的成员函数访问。
【例4.5】说明类A的功能:
class A {
private:
int x,y;
public:
void ask1(int a=0, int b=0);
int ask2();
void ask3();
};
void A::ask1(int a, int b) { x=a; y=b; }
int A::ask2()
{ if (x>y) return x;
else return y;
}
void A::ask3() { cout<<”x=”< 【解答】定义了一个类,类名为A,类A中有2个整型数据成员,它们都有私有数据;类A中有3个公有函数:ask1(int a=0, int b=0)、ask2()和ask3(),其中ask1(int a=0, int b=0)实现将a的值赋给x,b的值赋给y,若参数b,或参数a、b空缺时,其默认值为0;ask2()是找出私有数据x、y中最大值,将这个最大值作为这个函数的返回结果;ask3()实现输出x和y。 【例4.6】说明类B的功能: class B { private: int x,y; public: void ask1(int, int b=0); void ask2(); void ask3(); }; void B::ask1(int a, int b) { x=b; y=a; } void B::ask2() { int z; if (x } void B::ask3() { cout<<”x=”< 【解答】定义了一个类,类名为B,类B中有2个整型数据成员x和y,它们都有私有数据;类B中有3个公有函数:ask1(int a, int b=0)、ask2()和ask3(),其中ask1(int a, int b=0)实现将a的值赋给y,b的值赋给x,若参数b空缺时,b的默认值为0;ask2()是交换私有数据x、y中的值;ask3()实现输出x和y。 【例4.7】说明类C的功能: class C { private: int x,y; public: void ask(int, int); void ask(int); void ask(); } void C::ask(int a, int b) { x=a; y=b; } void C::ask(int a) { x=a; } void C::ask() { cout<<”x=”< 【解答】定义了一个类,类名为C,类C中有2个整型数据成员x和y,它们都有私有数据;类C中有3个重载的公有函数:ask(int ,int)、ask(int)和ask(),其中ask(int a, int b)实现将a的值赋给x,b的值赋给y;ask(int a)是将a的值赋给x;ask()实现输出x和y。 【例4.8】说明类D的功能: class D { private: int x; float y; public: void ask(int); void ask(float); void ask(); } void D::ask(int a) { x=a; } void D::ask(float b) { y=b; } void D::ask() { cout<<”x=”< 【解答】定义了一个类,类名为D,类D中有2个数据成员x和y,它们都有私有数据,x为整型,y为实型;类D中有3个重载的公有函数:ask(int a)、ask(float b)和ask(),其中ask(int a)实现将a的值赋给x;ask(float b) 实现将b的值赋给y;ask()实现输出x和y。 【例 4.9】设计一个表示猫的类,包括猫的颜色、体重、年龄等数据,具有设置猫的颜色,修改和显示猫的体重、年龄等操作。 【解答】设计猫类的类名为Cat,猫类Cat有3个数据成员,颜色用字符串color[7],可以存放3个汉字,体重用实型数weight表示,年龄用整型数age表示,为了数据的安全性,Cat的3个数据成员全部为私有的。对猫的属性数据的设置和修改PutColor为设置和修改颜色,PutWeight为设置和修改体重,PutAge为设置和修改年龄,它们都设置为公有函数,还要有一个1次设置3个参数的函数SetCat。设计函数Display输出猫的信息。 表示猫的类设计如下: class Cat { int age; char color[7]; float weight; public: void SetCat(char *s=”黄”, float w=1, int a=1); void PutColor(char *); void PutWeight(float ); void PutAge(int ); void Display(); }; void Cat::SetCat(char *s, float w, int a) { //猫的默认颜色为黄、体重1kg、年龄1岁 age=a; weight=w; strcpy(color,s); } void Cat::PutColor(char *s) { strcpy(color,s); } void Cat::PutWeight(float w) { weight=w; } void Cat::PutAge(int a) { age=a; } void Cat::Display() { cout<<”\n这只猫是一只”< cout<<”体重”< cout<<”年龄”< } 若猫的颜色是白色,重2.3kg,2岁,Display函数将会显示: 这只猫是一只白色的猫,体重2.3千克,年龄2岁。 【例4.10】设计一个表示学习成绩的类,至少包括三门课程的成绩,可以设置、显示每门课程的成绩,可以计算、显示平均成绩。 【解答】表示学习成绩的类简称为成绩类,设计成绩类的类名为Grade,成绩类Grade 的数据成员,应该包括学生的学号和姓名,因为可能有重名的学生,所以用学号作为唯一代表一个学生的关键字,假设学号全是9个字符,用字符串Number[10]表示,姓名最多为4个汉字,用字符串Name[9]表示, 可以存放4个汉字。假设有3门课,分别为C++程序设计语言,用整型变量Cpp表示;计算机原理,用整型变量Computer表示;数据库,用整型变量DataBase表示。平均成绩用实型变量Average表示。 为了Grade类数据的安全性,数据成员全部为私有的,对成绩类的属性数据用一些函数进行设置和修改,PutNo为设置和修改学号,PutName为设置和修改姓名,PutCpp为设置和修改C++程序设计语言的成绩,PutCom为设置和修改计算机原理的成绩,PutData为设置和修改数据库的成绩,还有一个同时设置所有5个参数的函数SetGrade,它们都设置为公有函数。计算平均成绩的函数为Calc,设计函数Display输出成绩。有时可能要查看某个学生的成绩,所以设计比较学号的函数为ComNo,设计比较姓名的函数为ComName, GetCpp 为读取C++程序设计语言的成绩,GetCom为读取计算机原理的成绩,GetData为读取数据库的成绩,设计读取平均成绩的函数为GetAve。计算平均成绩只是在类的内部实现,所以设计为私有函数,其它函数都设计为公有函数。 表示学习成绩的类设计如下: class Grade { char Number[10]; char Name[9]; int Cpp, Computer, DataBase; float A verage; void Calc(); public: void PutNo(char *); void PutName(char *); void PutCpp(int x=60); void PutCom(int x=60); void PutData(int x=60); void SetGrade(char *s1="123456789", char *s2="李华", int x=60, int y=60, int z=60); int ComNo(char *); int ComName(char *); int GetCpp(); int GetCom(); int GetData(); float GetA ve(); void Display(); }; void Grade::PutNo(char *s) { strcpy(Number,s); } void Grade::PutName(char *s) { strcpy(Name,s); } void Grade::PutCpp(int x) { Cpp=x; Calc(); //输入新数据就要计算平均值 } void Grade::PutCom(int x) { Computer=x; Calc(); //输入新数据就要计算平均值 } void Grade::PutData(int x) { DataBase=x; Calc(); //输入新数据就要计算平均值 } void Grade::Calc() { A verage=(Cpp+Computer+DataBase)/3; } void Grade::SetGrade(char *s1, char *s2,int x, int y, int z) { strcpy(Number,s1); strcpy(Name,s2); Cpp=x; Computer=y; DataBase=z; Calc(); //输入新数据就要计算平均值 } int Grade::ComNo(char *s) { return (!strcmp(Number,s)); } int Grade::ComName(char *s) { return (!strcmp(Name,s)); } int Grade::GetCpp(){ return Cpp; } int Grade::GetCom() { return Computer; } int Grade::GetData(){ return DataBase; } float Grade::GetA ve() { return A verage; } void Grade::Display() {