《02_C++课件_类与对象-类定义.ppt》由会员分享,可在线阅读,更多相关《02_C++课件_类与对象-类定义.ppt(28页珍藏版)》请在金锄头文库上搜索。
1、第二讲第二讲 类与对象类与对象类定义类定义类的概念类的概念类与结构体类与结构体类的定义类的定义访问权限访问权限内联函数内联函数1课堂练习n定义时钟结构体n定义两个函数实现时间设置和时间输出功能(要求形参是引用类型)n在主函数中调用两个函数2 是面向对象编程的程序基本单位(面向过程呢?)是面向对象编程的程序基本单位(面向过程呢?) 类是类是数据数据和操作数据的和操作数据的函数函数的封装(想想结构体)的封装(想想结构体) 类的对象使用自己的方法完成对数据的操作类的对象使用自己的方法完成对数据的操作 类可以隐藏数据和操作细节类可以隐藏数据和操作细节 何为类?何为类?3几点几点如何调整如何调整stru
2、ctstruct Time Time intint hour; hour; / 0-23/ 0-23 intint minute; minute;/ 0-59/ 0-59 intint second; second;/ 0-59/ 0-59 ; ; 结构类结构类4#include struct Timeint hour;int minute;int sec;intintintint main( ) main( ) main( ) main( ) Time t1; Time t1; Time t1; Time t1; cincincincint1.hourt1.minute t1.sec;t1.
3、hourt1.minute t1.sec;t1.hourt1.minute t1.sec;t1.hourt1.minute t1.sec; coutcoutcoutcoutt1.hour:t1.minutet1.hour:t1.minutet1.hour:t1.minutet1.hour:t1.minute :t1.sec :t1.sec :t1.sec :t1.sect2.hourt2.minutet2.sec;t2.hourt2.minutet2.sec;t2.hourt2.minutet2.sec;t2.hourt2.minutet2.sec; coutcoutcoutcoutt2.ho
4、ur:t2.minutet2.hour:t2.minutet2.hour:t2.minutet2.hour:t2.minute :t2.sec :t2.sec :t2.sec :t2.secendlendlendlendl; ; ; ; return 0;return 0;return 0;return 0; setTime(t1)setTime(t1);setTime(t2)setTime(t2);showTimeshowTime( t1 )( t1 ); showTimeshowTime( t2 )( t2 ); void void setTime(TimesetTime(Time& t)
5、;& t);void void showTime(TimeshowTime(Time& t);& t);结构类结构类5 #include struct Time int hour; int minute; int sec;void setTime(Time& t) cint.hourt.minutet.sec;void showTime( Time& t) coutt.hour:t.minute:t.secendl; intint main( ) main( ) Time t1; Time t1; setTime(t1); setTime(t1); showTime(t1); showTime
6、(t1); Time t2; Time t2; setTime(t2); setTime(t2); showTime(t2); showTime(t2); return 0;return 0; 结构类结构类6几点几点如何调整如何调整1.1 类 class class TimeTime private : private : 关于时间的数据; public :public : 读取时间值 ; ; 调整时间值 ; ;结构类结构类7构造构造class Time class Time private : private :intint hour; hour;intint minute; minute;
7、 intint second; second; ;public :public : void void set(int,int,intset(int,int,int);); void get( ); void get( );结构类结构类8#include class Time public: void setTime( ); void showTime( ); private: int hour; int minute; int sec;intintintint main( ) main( ) main( ) main( ) Time t1; Time t1; Time t1; Time t1
8、; t1.setTime( ); t1.setTime( ); t1.setTime( ); t1.setTime( ); t1.showTime( ); t1.showTime( ); t1.showTime( ); t1.showTime( ); Time t2; Time t2; Time t2; Time t2; t2.setTime( ); t2.setTime( ); t2.setTime( ); t2.setTime( ); t2.showTime( ); t2.showTime( ); t2.showTime( ); t2.showTime( ); return 0; retu
9、rn 0; return 0; return 0; 改用含成员函数的类来处理改用含成员函数的类来处理 9void Time:set_time( ) cinhour; cinminute; cinsec;void Time:show_time( ) couthour : minute : sechourminutesec;hourminutesec;hourminutesec;hourminutesec; void void void void show_timeshow_timeshow_timeshow_time( ) ( ) ( ) ( ) coutcoutcoutcouthour: ho
10、ur: hour: hour: minute: minute: minute: minute: sec sec sec secendlendlendlendl; ; ; ; private: private: private: private: intintintint hour; hour; hour; hour;intintintint minute; minute; minute; minute; intintintint sec; sec; sec; sec;改用含成员函数的类来处理改用含成员函数的类来处理 课堂练习:setTimesetTime()()加上时间有效性检验101.1.在
11、主函数中调用两个成员函数时,应指明对象名在主函数中调用两个成员函数时,应指明对象名(t1,t2)(t1,t2)。表示调用的是哪一个对象的成员函数。表示调用的是哪一个对象的成员函数。2. 2. 在类外定义函数时,应指明函数的作用域在类外定义函数时,应指明函数的作用域( (如如void void Timeset_timeTimeset_time( )( )。在。在成员函数引用本对成员函数引用本对象的数据成员时,只需直接写数据成员名象的数据成员时,只需直接写数据成员名,这时,这时C+C+系统会把它系统会把它默认默认为本对象的数据成员。也可以为本对象的数据成员。也可以显式显式地写出类名并使用域运算符。
12、地写出类名并使用域运算符。3. 3. 应注意区分什么场合用域运算符应注意区分什么场合用域运算符“”,什么,什么场合用成员运算符场合用成员运算符“. .”,不要搞混。,不要搞混。注意注意 11类的声明类的声明 n面向对象编程的基础是把自己的数据类型定义为类,面向对象编程的基础是把自己的数据类型定义为类,类是类是用户定义的数据类型用户定义的数据类型。n定义一个类后,就可以用定义一个类后,就可以用类名声明类类型的变量类名声明类类型的变量,即将类即将类实例化实例化为不同的对象;为不同的对象;nC+中用关键字中用关键字class定义包含定义包含数据成员数据成员和和成员函数成员函数的类型。的类型。类使程序
13、员可以构造对象的属性和行为或类使程序员可以构造对象的属性和行为或操作。操作。 12声明类类型声明类类型类是一种用户自定义的数据类型,它的一般定义格式如下:类是一种用户自定义的数据类型,它的一般定义格式如下:class 类名类名 private:私有私有数据成员数据成员和和成员函数成员函数; protected:保护保护数据成员数据成员和和成员函数成员函数; public:公有公有数据成员数据成员和和成员函数成员函数;;各个成员函数的实现;(类外或类内)各个成员函数的实现;(类外或类内)* *数据成员不能有初值;数据成员不能有初值;13访问控制访问控制n成员访问说明符成员访问说明符公有公有 pu
14、blic: 说明为公有的成员可以被说明为公有的成员可以被程序中的任何代码程序中的任何代码访问;访问; 私有私有 private: 说明为私有的成员只能被说明为私有的成员只能被类本身的成员函数及友元类本身的成员函数及友元 类成员函数或友元函数类成员函数或友元函数访问,默认类的对象的成员是私有;访问,默认类的对象的成员是私有; 保护保护 protected: 除了类本身的成员函数和说明为友元函数或友元类的成员除了类本身的成员函数和说明为友元函数或友元类的成员函数可以访问保护成员外,函数可以访问保护成员外,该类的派生类的成员也可以访问该类的派生类的成员也可以访问。 14访问控制访问控制nprivat
15、e声明的数据和函数不能在类以外访问声明的数据和函数不能在类以外访问npublic声明的数据和函数可以在类以外访问声明的数据和函数可以在类以外访问n默认为默认为private访问类型的访问类型的类数据和函数私有公有无法从类的外部访问可以从类的外部访问数据和函数15成员函数成员函数n成员函数为成员函数为描述对象的方法描述对象的方法n一般定义为公用的一般定义为公用的n类定义中的成员函数被类定义中的成员函数被默认创建为内联函数默认创建为内联函数n可在类的外部定义成员函数可在类的外部定义成员函数如果成员函数在类体外定义如果成员函数在类体外定义,可以用关键字可以用关键字inline声声明为内联函数明为内联
16、函数。在类的外部定义成员函数的语法:在类的外部定义成员函数的语法: 返回类型返回类型 类名类名:成员函数名成员函数名( ( ( (参数列表参数列表) ) ) ) 函数定义体函数定义体 双冒号称为域名解析分解符16内联函数内联函数n使用原因使用原因: 提高效率提高效率n使用方式使用方式: inline 前缀前缀,类内部函数实现缺省为内联函数。,类内部函数实现缺省为内联函数。 n工作原理:工作原理: 函数代码扩展嵌入到调用处函数代码扩展嵌入到调用处,并非调用,为,并非调用,为编译编译指令,指令,代码容量增大(一般是小函数),但减少调用的系统开销;代码容量增大(一般是小函数),但减少调用的系统开销;
17、程序运行速度快。程序运行速度快。n使用限制:使用限制: 与编译器有关与编译器有关 (1)不能包括循环分支转移语句。)不能包括循环分支转移语句。 (2)不能递归。)不能递归。 (3)不能包含)不能包含static语句。语句。存取函数通常被定义为内联函数存取函数通常被定义为内联函数17class class TdateTdate private: private: intint month; month; intint day; day; intint year; year; public: public:void void set(intset(int m, m, intint d, d, in
18、tint y ) y ) ;intint isLeapYearisLeapYear( )( ); void Print()void Print();;代码模拟:声明日期类18class class TdateTdate public: public:void void set(intset(int m, m, intint d, d, intint y ) ; y ) ; intint IsLeapYearIsLeapYear(); (); void Print( ); void Print( ); private: private: intint month; month; intint d
19、ay; day;intint year; year;void void Tdate:Tdate:Set(intSet(int m, m, intint d, d, intint y ) y ) month = m ; day = d ; year = y ; month = m ; day = d ; year = y ; intint TdateTdate: isLeapYearisLeapYear()() return ( year%4 = 0 & year%100 != 0 ) return ( year%4 = 0 & year%100 != 0 ) |( year%400 = 0);
20、 |( year%400 = 0); void void TdateTdate: print() print() coutcout year . month . day year . month . day endlendl ; ; 类的声明 类的实现在类外定义成员函数19class class TdateTdate public:public:void void set(intset(int m, m, intint d, d, intint y ) y ) month = m ; day = d ; year = y ; month = m ; day = d ; year = y ; i
21、ntint isLeapYearisLeapYear()() return ( year%4 = 0 & year%100 != 0 ) return ( year%4 = 0 & year%100 != 0 ) |( year%400 = 0); |( year%400 = 0); void print() void print() coutcout year . month . year . month . day day endlendl ; ; private:private: intint month month, dayday,year;year;代码模拟:声明日期类类中定义成员函
22、数内联函数处理20代码练习n定义一个student类,每个学生包含name, sex, number, score属性,并且实现显示和设置这些属性的成员函数。n要求:用到inline关键字21总结n类的概念n类与一般结构体的区别n类的设计n访问权限问题n内联函数22课后作业n1.类中数据成员和成员函数有何区别类中数据成员和成员函数有何区别?n2 类的访问权限有哪些类的访问权限有哪些? 并区别之并区别之.n3关于类定义格式的描述中,判断对错关于类定义格式的描述中,判断对错.A.一般类中包含有数据成员和成员函数一般类中包含有数据成员和成员函数. B.一般类的定义格式分为说明部分和实现部分一般类的定
23、义格式分为说明部分和实现部分. C.类中成员有三种访问方式类中成员有三种访问方式:公有公有,私有和保护私有和保护. D.成员函数都应是公有的成员函数都应是公有的,数据成员都应是私有的数据成员都应是私有的.n4关于类的成员函数描述中,判断对错关于类的成员函数描述中,判断对错. A.类中可以有一个和多个函数类中可以有一个和多个函数, B成员函数只能定义在类体外成员函数只能定义在类体外 C.定义在类体外的成员函数前加定义在类体外的成员函数前加inline可以成为内联函数可以成为内联函数. D.在类外定义成员函数时在类外定义成员函数时,在函数名前除了加类型说明符外在函数名前除了加类型说明符外,还需用作
24、用域符号来限定改成员函数所属的类还需用作用域符号来限定改成员函数所属的类.23课后作业5. 下面是下面是Time类的定义部分类的定义部分,找出其中错误找出其中错误:class Time public: / 函数原型省略函数原型省略 private: int hour=0; int minute=0; int second=0; 24课后作业1.设计一个类,实现两个复数的加减运算。2.设计一个点类Point其属性为其x,y坐标,能计算该点到(0,0)的距离。3.生成一个Rational类,描述最简分数,并进行最简分数的运算.n两个Rational相加,输出结果的简化形式n两个Rational相减
25、,输出结果的简化形式n两个Rational相乘,输出结果的简化形式n两个Rational相除,输出结果的简化形式n按a/b形式打印Rational,其中a为分子,b为分母25课后作业4.生成一个Rectangle类,描述长方形,具有length属性和width属性,其成员函数计算长方形的perimeter(周长)和area(面积)。26课后作业5.修改课堂上的Time类,用一个tick成员函数将Time对象中存放的时间递增1秒。Time对象总是保持一致状态。编写一个main程序,在循环中测试tick成员函数,按标准格式打印时间,从而演示tick成员函数的工作情况。要保证测试下列情况:n递增到下一分钟n递增到下一小时n递增到下一天(即23:59:59到00:00:00)27课后作业6.修改课堂上Tdate类,增加成员函数nextDay将日期递增一天。Tdate对象应该总是保持一致状态。测试该类,保证下列情况:n递增到下一月n递增到下一年28