




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+语言程序设计本章主要内容面向对象的思想OOP的基本特点类概念和声明对象构造函数析构函数内联成员函数拷贝构造函数类的组合结构体与联合体深度探索2回顾:面向过程的设计方法重点:如何实现的细节和过程,将数据与函数分开。形式:主模块+若干个子模块(main()+子函数)。特点:自顶向下,逐步求精功能分解。缺点:效率低,程序的可重用性差。3面向对象的思想面向对象的方法目的:实现软件设计的产业化。观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。要求:高度概括、分类和抽象。4面向对象的思想5面向对象的基本概念客观世界是由各种各样的实体组成的,这些实体就是面向
2、对象方客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。实体通常都具有法中的对象。实体通常都具有静态静态和和动态动态两种特征。两种特征。对象是由一组对象是由一组属性属性和一组和一组行为行为构成的,对应实体的静态和动态特构成的,对应实体的静态和动态特征。若要使对象实现某一行为,必须向它传递相应的消息。征。若要使对象实现某一行为,必须向它传递相应的消息。消息消息是向某对象请求服务的一种表达方式。是向某对象请求服务的一种表达方式。对象之间的交互通过发送消息来实现。每个对象之间的交互通过发送消息来实现。每个C+C+对象由对象由数据数据和和 函数函数两个部分组成,数据对应于对象的属性,
3、函数对应着对象两个部分组成,数据对应于对象的属性,函数对应着对象 的行为。的行为。 消息包括消息包括: :目标对象目标对象 , ,请求的方法请求的方法 , ,参数。对象通过相应消息参数。对象通过相应消息 来工作,实际上是对象对方法的函数调用。来工作,实际上是对象对方法的函数调用。面向对象的思想6面向对象程序设计的特征n抽象:数据抽象+代码抽象 n封装:数据和过程封藏起来n继承:基类和派生类n多态性:虚函数、函数重载面向对象的思想抽象抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相
4、互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明。7OOP的基本特点抽象实例钟表数据抽象:数据抽象:intint hourhour,int,int minuteminute,int,int secondsecond代码抽象:代码抽象:setTime()setTime(), ,showTimeshowTime()()8OOP的基本特点抽象实例钟表类class Clock class Clock publicpublic: : void void setTime(intsetTime(int newHnewH, , intint newMnewM, ,
5、 intint newSnewS);); void void showTimeshowTime();(); privateprivate: : intint hour, minute, second; hour, minute, second; ; ;9OOP的基本特点抽象实例人数据抽象:数据抽象:string string namename,string,string gendergender,int,int ageage,int,int idid代码抽象:代码抽象:生物属性角度:生物属性角度:getClothgetCloth(), (), eateat(), (), stepstep(),
6、(),社会属性角度:社会属性角度:workwork(), (), promotepromote() ,() ,10OOP的基本特点封装将抽象出的数据成员、代码成员相结合,将它们视为一个整体。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类声明中的 11OOP的基本特点12封装的两层含义一是将抽象得到的有关数据和操作代码相一是将抽象得到的有关数据和操作代码相结合,形成一个有机的整体,对象之间相对结合,形成一个有机的整体,对象之间相对独立,互不干扰。独立,互不干扰。二是封装将对象封闭保护起来,对象中的二是封装将对象封闭保
7、护起来,对象中的某些部分对外隐藏,隐藏内部实现细节,只某些部分对外隐藏,隐藏内部实现细节,只留下一些接口接收外界的消息,这种方法称留下一些接口接收外界的消息,这种方法称为为信息隐藏。信息隐藏。OOP的基本特点封装实例:class Clock public:void setTime(int newH, int newM, int newS); void showTime(); private: int hour, minute, second;13边界特定的访问权限OOP的基本特点外部接口继承与派生是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。14OOP的
8、基本特点15继承与派生一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原来类的特性,称为原类的派生类(子类),而原来的类称为新类的基类(父类)。继承避免了对基类和派生类之间共同特征进行重复描述。继承是一种联结类与类的层次模型。继承简化了人们对事物的认识和描述,人们可以重用已有软件中的一部分,减少了编程工程量,节省了测试和调试的时间,体现了软件复用的思想。实现:声明派生类见第7章OOP的基本特点多态性多态:同一名称,不同的功能实现方式。目的:达到行为标识统一,减少程序中标识符的个数。实现:重载函数和虚函数见第8章16OOP的基本特点c+中的类类是具有相同属性和行为的一组对象的集合,它
9、为属于该类的全部对象提供了统一的抽象描述,其内部包括属性属性和行为行为两个主要部分。利用类可以实现数据的封装、隐藏、继承与派生。利用类易于编写大型复杂程序,其模块化程度比C中采用函数更高。17类 和 对 象类的声明形式 类是一种用户自定义类型,声明形式:类是一种用户自定义类型,声明形式:class class 类名称类名称 public:public: 公有成员(外部接口)公有成员(外部接口) private:private: 私有成员私有成员 protected:protected: 保护型成员保护型成员 ;18类 和 对 象19类的声明形式a) 类声明以关键字类声明以关键字class开始,
10、其后跟类名开始,其后跟类名b) 类所声明的内容用花括号括起来,这一类所声明的内容用花括号括起来,这一 对花括号对花括号“ ”之间的内容称为类体。之间的内容称为类体。c)类中定义的成员包括数据成员和成员函数类中定义的成员包括数据成员和成员函数类 和 对 象公有类型成员在关键字在关键字public后面声明,它们是类与外部后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据的接口,任何外部函数都可以访问公有类型数据和函数。和函数。20类 和 对 象私有类型成员在关键字在关键字private后面声明,后面声明,只允许本类中的只允许本类中的函数访问,而类外部的任何函数都不能访问。函数访问,
11、而类外部的任何函数都不能访问。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。所有成员默认声明为所有成员默认声明为privateprivate权限权限21类 和 对 象保护类型与与private类似,其差别表现在继承与派生时类似,其差别表现在继承与派生时对派生类的影响不同,具体内容见第七章。对派生类的影响不同,具体内容见第七章。22类 和 对 象类的成员class Clock class Clock public: public: void void setTimesetTime(int(int newHn
12、ewH, , intint newMnewM, , intint newSnewS);); void void showTimeshowTime();(); private: private: intint hourhour, , minuteminute, , secondsecond; ;23类 和 对 象数据成员成员函数void void Clock:setTime(intClock:setTime(int newHnewH, , intint newMnewM, ,intint newSnewS) ) hour = hour = newHnewH; ; minute = minute
13、= newMnewM; ; second = second = newSnewS; ; void void Clock:showTimeClock:showTime() () coutcout hour : minute : hour : minute : second;second; 24数据成员与一般的变量声明相同,但需要将它放在类的声明体中25类 和 对 象成员函数在类中说明原型,可以在类外给出函数体实现,在类中说明原型,可以在类外给出函数体实现,并在函数名前使用类名加以限定。使用关键字并在函数名前使用类名加以限定。使用关键字inline将成员函数定义为内联函数将成员函数定义为内联函数也
14、可以直接在类中给出函数体,自动形成内联也可以直接在类中给出函数体,自动形成内联成员函数。成员函数。 允许声明重载函数和带默认形参值的函数允许声明重载函数和带默认形参值的函数26类 和 对 象27成员函数的定义返回类型返回类型 类名类名 成员函数名(参数列表)成员函数名(参数列表) 成员函数的函数体成员函数的函数体/内部实现内部实现 “ ”用于表明其后的成员函数是属于这个特定的类。用于表明其后的成员函数是属于这个特定的类。“ ”是作用域运算符,一个类的所有成员都在该类的作用是作用域运算符,一个类的所有成员都在该类的作用域内。这个类的任何成员都可以直接访问该类的其他任何域内。这个类的任何成员都可以
15、直接访问该类的其他任何成员。成员。内联成员函数为了提高运行时的效率,对于较简单的成员函数可以声明为内联形式。内联函数体中不要有复杂结构(如循环语句和switch语句)。在类中声明内联成员函数的方式:将函数体放在类的声明中。使用inline关键字。28类 和 对 象内联成员函数举例(一)class Point class Point public: public: void void init(intinit(int initXinitX, , intint initYinitY) ) x = x = initXinitX; ; y = y = initYinitY; ; intint getX
16、getX() () return x; return x; intint getYgetY() () return y; return y; private: private: intint x, y; x, y;29类 和 对 象内联成员函数举例(二)class Point class Point public: public: void void init(intinit(int initXinitX, , intint initYinitY);); intint getXgetX()(); intint getYgetY()(); private:private: intint x, y
17、; x, y;30类 和 对 象inlineinline void Point: void Point: init(intinit(int initX,intinitX,int initYinitY) ) x = x = initXinitX; ; y = y = initYinitY; ; inlineinline intint Point:getXPoint:getX() () return x; return x; inlineinline intint Point:GetYPoint:GetY() () return y; return y; 3132类的版式很多C+教课书受到Biar
18、ne Stroustrup第一本著作的影响,不知不觉地采用了“以数据为中心”的书写方式。建议采用“以行为为中心”(以函数为中心)的书写方式,即首先考虑类应该提供什么样的函数。因为用户最关心的是接口。33以数据为中心版式 以行为为中心的版式类 和 对 象class Aclass A private:private: intint i, j; i, j; float x, y; float x, y; public:public: void Func1(void); void Func1(void); void Func2(void); void Func2(void); class Aclass
19、 A public:public: void Func1(void); void Func1(void); void Func2(void); void Func2(void); private:private: intint i, j; i, j; float x, y; float x, y; 对象类的对象是该类的某一特定实体声明形式: 类名 对象名;例:Clock Clock myClockmyClock; ;同类对象之间可以整体赋值对象用作函数的参数时属于赋值调用函数可以返回一个对象34类 和 对 象35类与对象的关系a)类是对象的类型,代表了一批对象的共性和特征,规定了这些对象的公共
20、属性和方法,是对象集合的抽象。b)对象是类的一个实例。c)类不占内存单元,对象是类型的一个变量,是具体的,占用内存空间类 和 对 象类中成员的访问方式类中成员互访类中成员互访直接使用成员名类外访问类外访问使用“对象名对象名.成员名成员名”方式访问 public 属性的成员36类 和 对 象37类中成员互访class Person class Person private:private:charcharName20;Name20;intint Age;Age;charcharSex;Sex;public: /public: /外部接口外部接口 / /原型声明原型声明voidvoidRegist
21、er(charRegister(char * *name, name, intint age, char sex); age, char sex); void voidShowMeShowMe(); (); ;类 和 对 象38类中成员互访:直接访问void Person: void Person: Register(charRegister(char * *name, name, intint age, char sex) age, char sex) strcpy(strcpy(NameName, name);, name);AgeAge = = ageage; ;Sex Sex = (s
22、ex = m? = (sex = m? m:fm:f);); void Person: void Person: ShowMeShowMe()() coutcout NameName t t AgeAge t t Sex Sex endlendl; ; 类 和 对 象39类外访问类成员:通过函数接口类 和 对 象使用使用“对象名对象名.成员名成员名”方式访问方式访问 public 属性的成员函数属性的成员函数从而间接地访问其私有数据成员从而间接地访问其私有数据成员class Clock class Clock public: public: void void setTimesetTime(i
23、nt(int newHnewH, , intint newMnewM, , intint newSnewS);); void void showTimeshowTime();(); private: private: intint hourhour, , minuteminute, , secondsecond; ;40类 和 对 象数据成员成员函数例4-1类的应用举例void void Clock:setTime(intClock:setTime(int newHnewH, , intint newMnewM, ,intint newSnewS) ) hour = hour = newHne
24、wH; ; minute = minute = newMnewM; ; second = second = newSnewS; ; void void Clock:showTimeClock:showTime() () coutcout hour : minute : hour : minute : second;second; 41intint main() main() Clock Clock myClockmyClock; ;myClock.setTimemyClock.setTime(8, 30, 30);(8, 30, 30);myClock.showTimemyClock.show
25、Time();();return 0;return 0; 42类 和 对 象43class Person class Person private:private:charcharName20;Name20;intint Age;Age;charcharSex;Sex;public: /public: /外部接口外部接口 / /原型声明原型声明voidvoidRegister(charRegister(char * *name, name, intint age, char sex); age, char sex); void voidShowInfoShowInfo(); (); ;类 和
26、对 象类外访问类成员:通过函数接口44void Person: void Person: Register(charRegister(char * *name, name, intint age, char sex) age, char sex) strcpy(strcpy(NameName, name);, name);AgeAge = = ageage; ;Sex Sex = (sex = m? = (sex = m? m:fm:f);); void Person: void Person: ShowInfoShowInfo()() coutcout NameName t t AgeAge
27、 t t Sex Sex endlendl; ; 类 和 对 象类外访问类成员:通过函数接口45类外访问类成员:通过函数接口intint main() main() char name20, sex;char name20, sex;intint age; age;Person one, two;Person one, two;coutcout Enter a persons name, age and sex:; name age sex; name age sex;one.Register(nameone.Register(name, age, sex);, age, sex); cout
28、cout “first person: t; “first person: t;one.ShowInfoone.ShowInfo();();/调用类的成员函数输出调用类的成员函数输出one.Register(Zhang3, 19, m);one.Register(Zhang3, 19, m);coutcout “after modified ,the first persons information: t; “after modified ,the first persons information: t;one.ShowInfoone.ShowInfo();();/调用类的成员函数输出调用
29、类的成员函数输出two = one;two = one;/对象之间的赋值对象之间的赋值coutcout “the second persons information: t; ShowInfo (); /访问对象的成员,要使用箭头操作符等价于访问对象的成员,要使用箭头操作符等价于 sherlock. ShowInfo (); 注意:指针只能访问对象的公有成员注意:指针只能访问对象的公有成员49this指针类 和 对 象1 1、C+C+中每一个类的成员函数都包含一个指向本类对中每一个类的成员函数都包含一个指向本类对象的指针象的指针2 2、指针名为、指针名为thisthis3 3、该指针包含了当前
30、被调用的成员函数所在对象的、该指针包含了当前被调用的成员函数所在对象的起始地址起始地址50this指针的使用类 和 对 象#include class Test public: /好奇怪的函数?好奇怪的函数?Test( int a= 0 ); / Test( int = 0); void print();private: int x;51this指针的使用类 和 对 象Test:Test( int a ) x = a; / 构造函数构造函数void Test:print() cout x = x x = x n(*this).x = ( *this ).x endl;int main() Te
31、st testObject( 12 ); /测试对象测试对象testObject.print();return 0;52程序运行结果:类 和 对 象构造函数构造函数的作用是在对象被创建时使用特定的值构造对构造函数的作用是在对象被创建时使用特定的值构造对象,用于初始化对象。象,用于初始化对象。在对象创建时在对象创建时由编译系统自动关联某个构造函数由编译系统自动关联某个构造函数。如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一个隐含隐含的参数的参数列表为空的列表为空的默认构造函数默认构造函数。如果程序明确声明了构造函。如果程序明确声明了构造函数,则系统会调用程序声明的构造
32、函数。数,则系统会调用程序声明的构造函数。任意一个对象创建时只执行其中任意一个对象创建时只执行其中某一个某一个构造函数构造函数允许将构造函数定义为允许将构造函数定义为内联内联函数、函数、重载重载函数、函数、带默认形带默认形参值参值的函数的函数53构造函数和析构函数54构造函数构造函数是特殊的公有成员函数,其特征如下构造函数是特殊的公有成员函数,其特征如下:1.函数名与类名相同。函数名与类名相同。2.构造函数无函数返回类型说明。构造函数无函数返回类型说明。3.在新的对象被建立时,该对象所属的类的构造函数自在新的对象被建立时,该对象所属的类的构造函数自动被调用。动被调用。4.构造函数可以重载。它们
33、由不同的参数表区分,提供构造函数可以重载。它们由不同的参数表区分,提供初始化类对象的不同方法。初始化类对象的不同方法。构造函数和析构函数构造函数举例class Clock class Clock public:public:Clock(intClock(int newH,intnewH,int newM,intnewM,int newSnewS);/);/构造函数构造函数void void setTime(intsetTime(int newHnewH, , intint newMnewM, , intint newSnewS););void void showTimeshowTime();(
34、);private:private:intint hour, minute, second; hour, minute, second;55构造函数和析构函数构造函数的实现:构造函数的实现:Clock:Clock(intClock:Clock(int newHnewH, , intint newMnewM, , intint newSnewS) ) hour = hour = newHnewH; ;minute = minute = newMnewM; ;second = second = newSnewS; ; 思考和思考和void void setTime(intsetTime(int n
35、ewHnewH, , intint newMnewM, , intint newSnewS););的差别?的差别?intint main() main() Clock c(0,0,0); Clock c(0,0,0); /隐含自动调用构造函数,将初始值作为实参。隐含自动调用构造函数,将初始值作为实参。 c.showTimec.showTime();();return 0;return 0; 5657#include using namespace std;class Point public:int getX() return x; int getY() return y; private:i
36、nt x, y;int main() Point a; cout x = a.getX()endl; cout “y= a.getY()x = this-x = p.xp.x; ; this-y = this-y = p.yp.y; ; coutcout Calling the copy constructor Calling the copy constructor endlendl; ; 60拷贝构造函数(例4-2)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。intint main() main() Point a(1,2); Point a(1,2);
37、 Point b = a; Point b = a; /拷贝构造函数自动被调用拷贝构造函数自动被调用 coutcout “b b的横坐标是的横坐标是”b.getXb.getX() () endlendl; ; return 0; return 0; 61构造函数和析构函数拷贝构造函数(例4-2)若函数的形参为类对象,调用函数时,实参赋若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。值给形参,系统自动调用拷贝构造函数。void void function(Pointfunction(Point p) p) coutcout “p p的横坐标是的横坐标是”p.getXp
38、.getX() () endlendl; ; intint main() main() Point a(1, 2); Point a(1, 2); function(afunction(a); /); /调用拷贝构造函数调用拷贝构造函数 return 0; return 0; 62构造函数和析构函数拷贝构造函数(例4-2)当函数的返回值是类对象时,系统自动调用当函数的返回值是类对象时,系统自动调用拷贝构造函数。拷贝构造函数。Point function( ) Point function( ) Point a(1, 2); Point a(1, 2); return a; / return a
39、; /调用拷贝构造函数调用拷贝构造函数 intint main() main() Point b; Point b; b = function( ); b = function( ); coutcout “b b的横坐标是的横坐标是”b.getXb.getX() () endlendl; ; return 0; return 0; 63构造函数和析构函数隐含的拷贝构造函数如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。(生成一个完全相同的拷贝生成一个完全相同的拷
40、贝)64构造函数和析构函数65题目下列关于构造函数的描述中,错误的是下列关于构造函数的描述中,错误的是 【A】构造函数名与类名相同构造函数名与类名相同【B】构造函数没有返回类型说明构造函数没有返回类型说明【C】当程序员重载构造函数,添加一个当程序员重载构造函数,添加一个带参数带参数(无默认值)(无默认值)的构造函数后,的构造函数后,系统默认的无参数构造函数仍然可以被调用系统默认的无参数构造函数仍然可以被调用【D】每个类都有构造函数每个类都有构造函数构造函数和析构函数66#include using namespace std;class Point public:int getX() retu
41、rn x; int getY() return y; private:int x, y;int main() Point a; / 使用系统提供的缺省构造函数 cout x = a.getX()endl; cout y = a.getY()endl; return 0;如果没有显式定义构造函数67#include using namespace std;class Point public:Point(int xx , int yy ) x = xx; y = yy; int getX() return x; int getY() return y; private:int x, y;int
42、main() Point a; cout x = a.getX()endl; cout y = “ a.getY()endl; return 0;显式定义构造函数无默认值68#include using namespace std;class Point public:Point(int xx =0, int yy=0 ) x = xx; y = yy; int getX() return x; int getY() return y; private:int x, y;int main() Point a; cout x = a.getX()endl; cout y = “ a.getY()
43、endl; return 0;显式定义构造函数有默认值69题目假定A为一个类,则语句A(A &a);为该类 _函数的原型说明拷贝构造函数的参数是_。 构造函数和析构函数析构函数完成对象被删除前的一些完成对象被删除前的一些临时对象的空间临时对象的空间清理工作。清理工作。在对象的生存期结束的时刻在对象的生存期结束的时刻自动自动被调用,然后再释放被调用,然后再释放此对象所属的空间。此对象所属的空间。如果程序中未声明析构函数,如果程序中未声明析构函数,“幕后英雄幕后英雄”编译器将编译器将自动自动产生一个隐含的析构函数,并产生一个隐含的析构函数,并将它与对象关联起将它与对象关联起来来。70构造函
44、数和析构函数71析构函数格式: ();1.构函数名与类名相同,但在前面加上字符构函数名与类名相同,但在前面加上字符如如person()()2.析构函数无函数返回类型析构函数无函数返回类型3.一个类有一个也只有一个析构函数(不需要那么多一个类有一个也只有一个析构函数(不需要那么多)4.析构函数不需要带任何参数,因此不能重载析构函数不需要带任何参数,因此不能重载构造函数和析构函数构造函数和析构函数举例#include #include using namespace std;using namespace std;class Point class Point public:public: Poi
45、nt(intPoint(int xx,intxx,int yyyy);); Point(); Point(); /. /.其他函数原型其他函数原型private:private: intint x, y; x, y;72构造函数和析构函数Point:Point(intPoint:Point(int xx,intxx,int yyyy) ) this-x = xx; this-x = xx; this-y = this-y = yyyy; ; Point:PointPoint:Point() () 相关代码。相关代码。 coutcout“ “ 析构函数被调用析构函数被调用”endlendl; ;
46、 /./.其他函数的实现略其他函数的实现略73类的应用举例(例4-3)一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。74游泳池过道#include #include using namespace std;using namespace std;const double PI = 3.141593;const double PI = 3.141593;/给出给出p p的值的值const float FENCE_PRICE = 35;const flo
47、at FENCE_PRICE = 35; /栅栏的单价栅栏的单价const float CONCRETE_PRICE = 20;/const float CONCRETE_PRICE = 20;/过道水泥单价过道水泥单价class Circle class Circle /声明定义类声明定义类Circle Circle 及其数据和方法及其数据和方法public:public:/外部接口外部接口Circle(floatCircle(float r); r);/构造函数构造函数float circumference();float circumference();/计算圆的周长计算圆的周长floa
48、t area();float area();/计算圆的面积计算圆的面积 Circle(); Circle();private:private:/私有数据成员私有数据成员float radius;float radius;/圆半径圆半径;75/类的实现类的实现/构造函数初始化数据成员构造函数初始化数据成员radiusradiusCircle:Circle(floatCircle:Circle(float r) r) radius = r;radius = r; /计算圆的周长计算圆的周长float float Circle:circumferenceCircle:circumference()
49、() return 2 return 2 * * PI PI * * radius; radius; /计算圆的面积计算圆的面积float float Circle:areaCircle:area() () return PI return PI * * radius radius * * radiusradius; ; Circle:Circle:CircleCircle() () coutcout析构函数执行析构函数执行endlendl ; ; 76intint main () main () float radius;float radius;coutcout Enter the rad
50、ius of the pool: ; radius; radius;Circle Circle pool(radiuspool(radius););/游泳池边界游泳池边界Circle Circle poolRim(radiuspoolRim(radius + 3); + 3);/栅栏栅栏 /计算栅栏造价并输出计算栅栏造价并输出 float float fenceCostfenceCost = = poolRim.circumferencepoolRim.circumference() () * * FENCE_PRICE;FENCE_PRICE; coutcout Fencing Cost i
51、s $ Fencing Cost is $ fenceCostfenceCost endlendl; ;77/计算过道造价并输出计算过道造价并输出float float concreteCostconcreteCost = ( = (poolRim.areapoolRim.area() - () - pool.areapool.area() () * * CONCRETE_PRICE;CONCRETE_PRICE;coutcout Concrete Cost is $ Concrete Cost is $ concreteCostconcreteCost x = xx; this-x = xx
52、; this-y = this-y = yyyy; ; 组合的概念(整体与部分的关系)类中的类中的数据成员数据成员是另一个类的是另一个类的对象对象。可以在已有抽象抽象的基础上实现更复杂的抽象抽象。83举例class Point class Point public:public: Point(floatPoint(float h, float v); / h, float v); /构造函数构造函数 float float getXgetX(); /(); /取取X X坐标坐标 float float getYgetY(); /(); /取取Y Y坐标坐标 void draw(); /void
53、 draw(); /在在( (x,yx,y) )处画点处画点private:private: float x, y; / float x, y; /点的坐标点的坐标;/./.函数的实现略函数的实现略84类 的 组 合class Line /class Line /描述线段这个概念描述线段这个概念private:private: Point p1, p2; / Point p1, p2; /线段的两个端点线段的两个端点public:public: Line(PointLine(Point a, Point b); / a, Point b); /构造函数构造函数 void void draw(v
54、oiddraw(void); /); /画出线段画出线段;/./.函数的实现略函数的实现略85类组合的构造函数设计原则:不仅要负责对本类中的基本类型成员数据赋初原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员值,也要对对象成员( (内嵌对象内嵌对象) )初始化。初始化。建议声明形式:建议声明形式:类名:类名(对象成员对象成员所需的形参,本类其他成员其他成员形参) : :对象对象1(1(参数参数) ),对象,对象2(2(参数参数) ),. 本类其他普通类型成员初始化语句 86类 的 组 合类组合的构造函数调用构造函数调用顺序:先调用内嵌对象的构造函数先调用内嵌对象的构造函数(按内
55、嵌时的(按内嵌时的声明顺序,不是初始化的顺序,声明顺序,不是初始化的顺序,先先声明者先构造)。然后调用本类的构造函数。声明者先构造)。然后调用本类的构造函数。(析构函数的调用顺序相反)(析构函数的调用顺序相反)初始化列表中未出现的内嵌对象,用默认构造函初始化列表中未出现的内嵌对象,用默认构造函数(即无形参的)初始化数(即无形参的)初始化系统自动生成的组合类的隐含的默认构造函数中,系统自动生成的组合类的隐含的默认构造函数中,内嵌对象全部用默认构造函数初始化内嵌对象全部用默认构造函数初始化内嵌对象内嵌对象 = 对象成员对象成员87类 的 组 合类的组合举例(二)class Part /class
56、Part /部件类部件类public:public: Part() Part() coutcout“Part“Part缺省构造函数被调用缺省构造函数被调用”endlendl; ; Part(intPart(int i) i) price = i; price = i; coutcout“Part“Part带一个参数的构造函数被调用带一个参数的构造函数被调用”endlendl; Part() Part() coutcout“Part“Part析构函数被调用析构函数被调用”endlendl; void Print(); void Print(); private:private: intint p
57、rice; price;88class Whole class Whole public:public: Whole(); Whole(); Whole(intWhole(int i, i, intint j, j, intint k); k); Whole(); Whole(); void Print(); void Print(); private:private: Part one; / Part one; /对象成员(内嵌对象)对象成员(内嵌对象) Part two; / Part two; /对象成员(内嵌对象)对象成员(内嵌对象) intint date; / date; /其他普
58、通成员其他普通成员;89Whole:WholeWhole:Whole() () date=0; date=0; coutcout“Whole“Whole无参构造函数被调用无参构造函数被调用”endlendl; ; Whole:Whole(intWhole:Whole(int i, i, intint j, j, intint k) k) : : two(itwo(i), ), one(jone(j), ), date(kdate(k) ) coutcout“Whole“Whole三个参数的构造函数被调用三个参数的构造函数被调用”endlendl;Whole:WholeWhole:Whole()
59、 () coutcout“Whole“Whole析构函数被调用析构函数被调用”endlendl; ; 90主函数测试:int main() Whole lego_circle; /不提供参数 Whole lego_triangle(200,100,20140326); return 0;91/4_4.cpp 完整的类组合的应用程序#include #include using namespace std;class Point /Point类定义public:Point(int xx = 0, int yy = 0) this-x = xx;this-y = yy;Point(Point &a
60、mp;p);int getX() return this-x; int getY() return this-y; private:int x, y; ;/拷贝构造函数的实现Point:Point(Point &p) this-x = p.x;this-y = p.y;cout Calling the copy constructor of Point len; /默认内联函数private:/私有数据成员Point p1, p2;/Point类的对象p1,p2double len;/组合类的构造函数Line:Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) cout Calling construc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第16课《驱遣我们的想象》教学设计 2024-2025学年统编版语文九年级下册
- 河北省保定市高阳县2023-2024学年七年级下学期期末语文试题
- 2025年湖南电子科技职业学院单招职业倾向性测试题库学生专用
- 护理学研究习题库(附答案)
- 人工智能题库含参考答案
- 2 我是什么(教学设计)-2024-2025学年统编版语文二年级上册
- 2024四川雅安市雅茶集团茶业有限公司第一期招聘拟聘用人员笔试参考题库附带答案详解
- 第1课 古代埃及-2024-2025学年九年级历史上册册核心素养驱动教学设计
- 03 19 苏州园林2024-2025学年八年级语文上册同步教学设计(河北专版)
- 12 《富起来到强起来》教学设计-2023-2024学年道德与法治五年级下册统编版
- 新中国成立后的中国国防
- 热烈欢迎领导莅临指导ppt模板
- 不规则抗体筛查与鉴定
- 2023-2024人教版小学2二年级数学下册(全册)教案【新教材】
- 中国银行海尔多联机方案书
- 小学《体育与健康》体育基础理论知识
- JJG 144-2007标准测力仪
- GB/T 8417-2003灯光信号颜色
- GB/T 7984-2001输送带具有橡胶或塑料覆盖层的普通用途织物芯输送带
- GB/T 7324-2010通用锂基润滑脂
- GB/T 5916-2020产蛋鸡和肉鸡配合饲料
评论
0/150
提交评论