第八章 类和对象
序 数据类型 变量 整型 int 整型变量 int x; 结构体类型 结构体变量 [struct] stu john; struct stu 数据类型 变量 整型 int 整型变量 int x; 结构体类型 结构体变量 [struct] stu john; struct stu { char name[20]; int age; int score[3]; }; 如何求每个人的三门课的平均成绩?
既包含数据,又有对这些数据的处理(函数)! 结构数据类型分析 只含有数据成员,而无数据处理(操作) 输出学生的平均成绩; 包含有不同信息项; 但无数据处理功能;(课程平均分) 能否构造一个新的数据类型, 既包含数据,又有对这些数据的处理(函数)!
8.1 面向对象程序设计方法概述 任何一个对象都应当具有这两个要素, 即属性(attribute)和行为(behavior), 对象(object):客观世界中任何一个事物都可以看成一个对象。 抽象(abstraction):抽象的过程是将有关事物的共性归纳、集中的过程。 任何一个对象都应当具有这两个要素, 即属性(attribute)和行为(behavior), 对象太多->抽象
对象和类 具体 对象 类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。 抽象 类 数字 整数 具体 对象 抽象 类 利用数字来解释具体和抽象。 1.1 2 33 6.89 数字 11 22 33 66 整数 数字 整数 1.1 2.2 36 45 20.09 11 22 33 44 55 66
8.2 类的声明和对象的定义 变量 数据类型 结构体变量 结构体类型 类变量 类类型 对象 类
8.2.2 声明类类型 声明结构体类型的方法: //声明了一个名为Student的结构体类型 //定义了两个结构体变量stud1和stud2
结构体变量成员的引用(访问) 引用结构体变量中成员的一般方式为 结构体变量名.成员名 成员运算符 .
类的声明 类头 先声明 类体
对象成员的引用? 成员访问权限? 'num' : cannot access private member declared in class 'Student‘ 'name' : cannot access private member declared in class 'Student‘ 'sex' : cannot access private member declared in class 'Student' error C2248: 'display' : cannot access private member declared in class 'Student'
如果在类的定义中既不指定private,也不指定public, 成员访问限定符 用来声明各个成员的访问属性。 public(公用的): 既可被本类中成员函数引用,也可被类的作用域内的类外的其他函数引用; private(私有的):只能被本类中的成员函数调用,类外不能调用; protected(受保护的):不能被类外访问,但可以被派生类的成员函数访问; 一般是把数据隐蔽起来,把成员函数作为对外界的接口。 如果在类的定义中既不指定private,也不指定public, 则系统就默认为是私有的。
访问属性的详细解读 #include <string> #include <iostream> using namespace std; class Student //类定义 { public: void display( ); //公用成员函数原型声明 private: int num; char name[20]; char sex ; }; void Student::display( ) { //在类外定义display类函数 //类内 成员函数访问类内私有成员 cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } void printInfo() { //类外普通函数访问类内私有成员 cout<<num<<' '<<name<<' '<<sex<<endl; int main() Student stud; cout<<stud.num<<endl; //通过对象访问私有数据成员 cout<<stud.name<<endl; //通过对象访问私有数据成员 cout<<stud.sex<<endl; //通过对象访问私有数据成员 stud.display(); //通过对象访问公有成员函数 pringInfo(); return 0;
类类型声明的一般形式
8.2.3 定义对象的方法 1. 先声明类类型,然后再定义对象 (1) class 类名 对象名 如 class Student stud1,stud2; (2) 类名 对象名 Student stud1,stud2;
2. 在声明类类型的同时定义对象
3. 不出现类名,直接定义对象
8.2.4 类和结构体类型的异同 声明的类类型改为用关键字struct:
区别 用struct声明的类,如果对其成员不作private或public的声明,系统将其默认为public。如果想分别指定私有成员和公用成员,则应用private或public作显式声明。 而用class定义的类,如果不作private或public声明,系统将其成员默认为private,在需要时也可以自己用显式声明改变。 默认情况下,成员访问的区别
8.3 类的成员函数 8.3.1 成员函数的性质 与一般函数的区别只是: 它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、 public(公用的)或 protected(受保护的)。
成员函数可以访问本类中任何成员 一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。
练习 声明一个学生类类型,数据成员包括姓名、学号、三门课程的成绩,成员函数的功能为求三门课程的平均成绩。 并定义两个对象stu1,stu2。
8.3.2 在类外定义成员函数 作用域限定符
课后习题1 ??? #include <iostream> using namespace std; class Time { 课后习题1 ??? #include <iostream> using namespace std; class Time { public: void set_time( ); //公用成员函数 void show_time( ); //公用成员函数 private: //数据成员为私有 int hour; int minute; int sec; }; Time t1; //定义对象t1 int main( ) t1.set_time( ); //调用对象t1的成员函数set_time,向t1的数据成员输入数据 t1.show_time( ); //调用对象t1的成员函数show_time,输出t1的数据成员的值 return 0; } void Time::set_time( ) //在类外定义set_time函数 cin>>hour; cin>>minute; cin>>sec; void Time::show_time( ) //在类外定义show_time函数 cout<<hour<<':'<<minute<<':'<<sec<<endl;
8.4 对象成员的引用 在程序中经常需要访问对象中的成员。访问对象中的成员可以有3种方法: 通过对象名和成员运算符访问对象中的成员; 通过指向对象的指针访问对象中的成员; 通过对象的引用变量访问对象中的成员。
class Student { public: void display( ); //公用成员函数原型声明 private: int num; char name[20]; char sex; //以上3行是私有数据成员 }; void Student::display( ) //在类外定义display类函数 cout<<"num:"<<num<<endl; //函数体 cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } Student stud1,stud2; //定义两个类对象
8.4.1 通过对象名和成员运算符访问对象中的成员 stud1.num=1001; //假设num已定义为公用的整型数据成员
8.4.2 通过指向对象的指针访问对象中的成员 在p指向t的前提下,p->hour,(*p).hour和t.hour三者等价。
引用reference 引用:某一对象的别名; 不是独立的数据类型 声明的同时必须初始化,声明它代表哪个对象 &:引用声明符
如果已声明了Time类,并有以下定义语句: Time t1; //定义对象t1 Time &t2=t1; //定义Time类引用变量t2,并使之初始 //化为t1 cout<<t2.hour; //输出对象t1中的成员hour 由于t2与t1共占同一段存储单元 (即t2是t1的别名),因此t2.hour就是t1.hour。
8.6 类和对象的简单应用举例
多个对象成员的处理 #include <iostream> using namespace std; class Time { public: int hour; int minute; int sec; }; int main( ) Time t1; //定义对象t1 cin>>t1.hour; //向t1的数据成员输入数据 cin>>t1.minute; cin>>t1.sec; //输出t1中数据成员的值 cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl; Time t2; //定义对象t2 cin>>t2.hour; //向t2的数据成员输入数据 cin>>t2.minute; cin>>t2.sec; //输出t2中数据成员的值 cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl; return 0; }
通过函数实现输入和输出
通过函数实现输入和输出 成员 没有体现出类的优越性
练习 声明一个圆柱体类,然后定义一个该类的对象,通过键盘输入对象的底面半径和高,利用普通函数计算盖圆柱体的体积并输出到屏幕上。
#include <iostream> using namespace std; class Cylinder //定义Time类 { public: //数据成员为公用的 float r; float h; }; int main() Cylinder c1; cout<<"输入圆柱体的半径和高"<<endl; cin>>c1.r>>c1.h; cout<<"圆柱体的体积为:"<<3.14*c1.r*c1.r*c1.h<<endl; return 0; }
练习 设计一个长方形类,数据成员包括长len和宽wid,要求用成员函数实现以下功能: 由键盘输入长方形的长和宽; 计算长方形的面积; 修改长方形的长和宽为原来数值的2倍;
#include <iostream> using namespace std; class Rectangle { public: void setValue( ); //公用成员函数 float area( ); //公用成员函数 void resize(); //公用成员函数 private: //数据成员为私有 float len; float wid; }; int main( ) Rectangle r1; r1.setValue(); cout<<"矩形面积为:"<<r1.area()<<endl; r1.resize(); return 0; } void Rectangle::setValue() cout<<"输入长方形的长和宽"<<endl; cin>>len>>wid; float Rectangle::area() return len*wid; void Rectangle::resize() len = 2*len; wid *= 2; cout<<"变更后的矩形的长和宽为:"<<len<<' '<<wid<<endl;
8.6 类的封装性和信息隐蔽 数据私有,函数开放 接口与实现分离 名词解释: 详细说明!!(结合实验题目) 成员函数:方法method 公用方法才能被外界通过消息(message)激活 stud.display(); 详细说明!!(结合实验题目)