上泽充通大¥ C+程序设计与实践 第6讲C++类(1) 上海交通大学 机械与动力工程学院 2014.9-2015.1 上海京通大学 1.类与类的封装 2.类的构造与析构 3. 类的继承与派生 SH 1 1
1 1/48 第6讲 C++类(1) C++程序设计与实践 上海交通大学 机械与动力工程学院 2014.9-2015.1 2/48 1. 类与类的封装 2. 类的构造与析构 3. 类的继承与派生
类和对象 口类代表了某一批对象的共性和特征。 口类是对象的抽象,而对象是类的具体实例。 11 10 09:90:5 时钟类 变量:时 76.5 数字钟 秒 操作: 显示时间 设置时间 类和对象 口编程描述一个时钟,具备时间参数和设置、显示时问功能。 口面向过程的实现方式 void main( 在main函数中对不同 时钟的设置操作一一 double hour,minute,second; 写出,使程序冗长 cin>>hour; cin>>minute; cin>>second; 0 cout>hour; cin>>minute; cin>>second; cout<<hour<<":"<<minute<<":"<<second<<endl; 2
2 3 类和对象 类代表了某一批对象的共性和特征。 类是对象的抽象,而对象是类的具体实例。 时钟类 变量: 时 分 秒 操作: 显示时间 设置时间 4 类和对象 面向过程的实现方式 void main() { double hour, minute, second; cin>>hour; cin>>minute; cin>>second; cout>hour; cin>>minute; cin>>second; cout<<hour<<":"<<minute<<":"<<second<<endl; } 在main函数中对不同 时钟的设置操作一一 写出,使程序冗长 编程描述一个时钟,具备时间参数和设置、显示时间功能
类和对象 口面向过程的实现方式利用结构体 结构体中封装 struct Clock 数据成员 { double hour; 。0○ double minute; void main() double second: { Clock cl; ; Set_Time(cl); void Set Time(Clock&cl) Show_Time(cl); cin>>cl.hour; cin>>cl.minute; cin>>cl.second; void Show Time(Clock&cl) cout>hour>>minute>>sec;} void show time() (成员函数) 设置时间 cout<<hour<<“:”<minute<<“:”<<sec<<endl; 显示时间 6 3
3 5 面向过程的实现方式----利用结构体 struct Clock { double hour; double minute; double second; }; void main() { Clock cl; Set_Time(cl); Show_Time(cl); } 结构体中封装 数据成员 void Set_Time(Clock& cl) { cin>>cl.hour; cin>>cl.minute; cin>>cl.second; } void Show_Time(Clock& cl) {cout>hour>>minute>>sec; } void show_time( ) { cout<<hour<<“:”<<minute<<“:”<<sec<<endl; } }; class 类名 (数据) 小时、分、秒 (成员函数) 设置时间 显示时间 类数据类型中的数据既包含数据和操作数据的函数。 类和对象
类和对象 口它的意义在于将相互关联的一组数据和函数封装在一起, 组成一个编程单元:对象。 口使用可以让一组值存放在一起,而且还能为它添加功能。 数据 中 操作 类 hour set time Clock minute show_time second 7 类的声明 口封装:一般把数据隐蔽起来,把成员函数作为对外界的接口。 口成员访问权限控制符:private,public,protected(缺省默 认为private). class Clock { private: 默认值 int hour; int minute; 访问权限 int sec; public: N void set_time(); void show_time(); 4
4 7 它的意义在于将相互关联的一组数据和函数封装在一起, 组成一个编程单元:对象。 使用可以让一组值存放在一起,而且还能为它添加功能。 类和对象 hour minute second set_time show_time Clock 8 类的声明 class Clock { private: int hour; int minute; int sec; public: void set_time( ); void show_time( ); }; 默认值 访问权限 封装:一般把数据隐蔽起来,把成员函数作为对外界的接口。 成员访问权限控制符: private,public,protected(缺省默 认为private)
类的成员函数 口成员函数可以在类体中定义,也可以在类的外面进行函数定义 class Clock public: void set time(); void show time(); private: int hour; int minute; int sec; }; void Clock::show_time() /∥在类外定义shoW_time函数 cout<<hour<<“:”<<minute<<“:”<<sec<<endl; 1/函数体 9 对象定义 1.先声明类类型,然后再定义对象 2.在声明类类型的同时定义对象 class Clock class Clock {public: public: void set_time(); void set time(); void show_time(); void show_time(); private: private: int hour; int hour; int minute; int minute; int sec; int sec; 3: }clk1.clk2; Clock clk1,clk2; /定义了两个Clock类的对象 /类名对象名 class Clock clkl.clk2: /class类名对象名 10 5
5 9 类的成员函数 成员函数可以在类体中定义,也可以在类的外面进行函数定义 class Clock { public: void set_time( ); void show_time( ); private: int hour; int minute; int sec; }; void Clock::show_time( ) //在类外定义show_time函数 { cout<<hour<<“:”<<minute<<“:”<<sec<<endl; //函数体 } 10 对象定义 1.先声明类类型,然后再定义对象 class Clock { public: void set_time( ); void show_time( ); private: int hour; int minute; int sec; }; Clock clk1,clk2; //类名 对象名 class Clock clk1,clk2; //class 类名 对象名 2. 在声明类类型的同时定义对象 class Clock { public: void set_time( ); void show_time( ); private: int hour; int minute; int sec; }clk1,clk2; //定义了两个Clock类的对象
访问对象中的成员 口一般形式为:对象名成员名 class Clock { public: void show time(); void set_time(); private: int minute; int sec; 访问权限?冬 int hour; }clkl; L clkl.hour=11; clkl.show_time(); 只能访问public成员,而不能访 问privatel成员 11 访问对象中的成员 口通过指针引用对象中的成员 class Clock cin>>t.hour; cin>>t.minute; public:/数据成员是公用的 cin>>t.sec; int hour; int minute; int sec; p=&t;∥使p指向对象t ; 输出指向的对像中的成员数据 couthourminutesechour,(使p).hour和t.hour3三者等价 12 6
6 11 访问对象中的成员 class Clock { public: void show_time( ); void set_time( ); private: int minute; int sec; int hour; }clk1; clk1.hour=11; clk1.show_time(); 访问权限? 一般形式为: 对象名.成员名 只能访问public成员,而不能访 问private成员 12 访问对象中的成员 class Clock { public: //数据成员是公用的 int hour; int minute; int sec; }; void main() { Clock t,*p; //定义对象t和指针变量p cin>>t.hour; cin>>t.minute; cin>>t.sec; p=&t; //使p指向对象t //输出p指向的对象中的成员数据 couthourminutesechour,(*p).hour和 t.hour三者等价 通过指针引用对象中的成员
访问对象中的成员 口引用变量来访问对象中的成员 class Clock cin>>t1.hour; { cin>>t1.minute; public:∥数据成员是公用的 cin>>tl.sec; int hour; int minute; ∥定义引用变量2,并使之初始化为1 int sec; Clock &t2=t1; ; void mainO 1/输出对象t1中的成员数据 cout int main() using namespace std; class Clock Clock t1;/定义对象t1 t1.set_time(); public:∥公用成员函数 t1.show time(); void set_time(); C1ockt2;/定义对象t2 void show_time(); t2.set_time(); private::I数据成员为私有 t2.show_time(); int hour; return 0; int minute; int sec; 14 7
7 13 引用变量来访问对象中的成员 由于t2与t1共占同一段存储单元(即t2是t1的别名),因此t2.hour就是t1.hour。 cin>>t1.hour; cin>>t1.minute; cin>>t1.sec; //定义引用变量t2,并使之初始化为t1 Clock &t2=t1; //输出对象t1中的成员数据 cout using namespace std; class Clock { public://公用成员函数 void set_time( ); void show_time( ); private: //数据成员为私有 int hour; int minute; int sec; }; int main( ) { Clock t1; //定义对象t1 t1.set_time( ); t1.show_time( ); Clock t2; //定义对象t2 t2.set_time( ); t2.show_time( ); return 0; }
类与对象应用-时钟类 void Time::set_time() /在类外定义set_time函数 cin>>hour; cin>>minute; cin>>sec; void Tim::show time() /在类外定义show timei函数 { cout<<hour<<":"<<minute<<":"<<sec<<endl; 15 静态数据成员 口静态数据成员实现同类的多个对象之间数据共享 class Clock public: int hour; private: int minute; int sec; staticint alarm hour;/把alarm hour定义为静态的数据成员 }; int Clock:alarm hour=0; /对静态数据成员初始化 各Clock对象中的alarm_hour的值是一样的,它为各对象所共有,而不只属于某 个对象的成员,所有对象都可以引用它。 16 8
8 15 void Time::set_time( ) //在类外定义set_time函数 { cin>>hour; cin>>minute; cin>>sec; } void Tim::show_time( ) //在类外定义show_time函数 { cout<<hour<<":"<<minute<<":"<<sec<<endl; } 类与对象应用-时钟类 16 静态数据成员 静态数据成员实现同类的多个对象之间数据共享 class Clock { public: int hour; private: int minute; int sec; static int alarm_hour;//把alarm_hour定义为静态的数据成员 }; int Clock::alarm_hour=0; //对静态数据成员初始化 各Clock对象中的alarm_hour的值是一样的,它为各对象所共有,而不只属于某 个对象的成员,所有对象都可以引用它
静态成员函数 口在类中声明函数的前面加static就成了静态成员函数,访问静态成员 class Clock public: int main( void set time(); static void show_time()片/声明静态成员函数 Clock t1; private: static int hour;/静态数据成员 t1.set_time(); static int minute; t1.show_time(); static int sec; Clock t2:; t2.show time(); int Clock::hour =10; int Clock::minute=30; 0 int Clock::sec=45: void Clock::set time() 124529 fcin>>hour>>minute>>sec; 12:45:29 void Clock::show time() 12:45:29 fcout<<hour<<":"<<minute<<":"<<sec<<endl;) 17 上海京通大学 1.类与类的封装 2.类的构造与析构 3.类的继承与派生 9
9 17 静态成员函数 在类中声明函数的前面加static就成了静态成员函数,访问静态成员 class Clock {public: void set_time( ); static void show_time( ); //声明静态成员函数 private: static int hour; //静态数据成员 static int minute; static int sec; }; int Clock::hour =10; int Clock::minute=30; int Clock::sec=45; void Clock::set_time( ) {cin>>hour>>minute>>sec;} void Clock::show_time( ) {cout<<hour<<":"<<minute<<":"<<sec<<endl;} 12 45 29 12:45:29 12:45:29 int main() { Clock t1; t1.set_time( ); t1.show_time( ); Clock t2; t2.show_time( ); } 18/48 1. 类与类的封装 2. 类的构造与析构 3. 类的继承与派生
对象的初始化 口建立一个对象时,常常需要对数据成员赋初值。 class Clock public: int hour; int min; int sec; private: bool sound; string sharp; string color; 如何初始化每个钟表对象? 19 对象的初始化 口Sound,sharp,.color是私有成员,不能在定义时赋初值。 >多个完全相同对象 >多个含相同属性的对象 .9.. >多个私有属性完全不同对象 20 10
10 19 对象的初始化 class Clock { public: int hour; int min; int sec; private: bool sound; string sharp; string color; }; 建立一个对象时,常常需要对数据成员赋初值。 如何初始化每个钟表对象? 20 多个完全相同对象 多个含相同属性的对象 多个私有属性完全不同对象 Sound, sharp, color是私有成员,不能在定义时赋初值。 对象的初始化