已阅读5页,还剩148页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章面向对象程序设计,3.1面向对象程序设计思想3.2类和对象3.3面向对象程序的结构3.4动态内存分配习题,3.1面向对象程序设计思想,3.1.1面向对象程序设计的特点1抽象性用C+语言可以将该图形描述如下:圆形(circle):数据抽象:doublex,y,r;行为抽象:setx();sety();setr();draw();,抽象是面向对象方法的核心。2封装性3继承性4多态性多态性也是面向对象程序设计的重要特性之一。,3.1.2面向对象的标记图3-1给出了类的标记方法和一个point类的标记实例,point类将在本章的后面部分定义和使用。,图3-1类的标记图,对象是类的实例,在Cord/Yourdon标记中,对象是在相应类标记外加一个圆角矩形框,如图3-2所示。,图3-2对象的标记图,连接符号主要有三种,它们分别表示消息联系、继承关系和包含关系,如图3-3所示。,图3-3Cord/Yourdon标记中的连接符号(a)消息联系;(b)继承关系;(c)包含关系,3.2类和对象,3.2.1类的声明类的声明即类的定义,声明一个类的语法与结构的声明类似,其一般形式为:classprivate:public:;,其中,class是声明类的关键字;是标识符,表示声明的类的名字;类声明体内的函数和变量称为这个类的成员,分别称为成员函数和数据成员。类的成员函数用于对数据成员进行处理,又称为“方法”,程序中通过类的成员函数来访问其内部的数据成员,成员函数是类与外部程序之间的接口。一般类中成员函数的原型声明写在类定义体内,用以说明该成员函数的形式参数和返回值类型,而成员函数的定义体一般写在类定义之外。通常采用下面的形式定义成员函数::(),例如:classrectangleprivate:intx,y,weight,high;public:rectangle(intxx,intyy,intw,inth)x=xx;y=yy;weight=w;high=h;inlineintarea();inlineintrectangle:area()returnweight*high;,3.2.2对象类和对象的关系相当于普通数据类型与其变量的关系。类是一种逻辑抽象概念,声明一个类只是定义了一种新的数据类型,对象说明才真正创建了这种数据类型的物理实体。由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值可能不同。一旦创建了一个类的对象,程序就可以用运算符“.”来引用类的公有成员,其一般形式为,或例如,前面我们定义一个rectangle类,现在我们定义一个rectangle的对象r1,通过对象r1完成对成员函数area()的调用。rectangler1(10,10,20,20);r1.area();需要注意,只有用public定义的公有成员才能使用圆点操作符访问,对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。,3.2.3构造函数和析构函数1.构造函数构造函数是在类中声明的一种特殊的成员函数,作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的状态。构造函数的名字与它所属的类名相同,被声明为公有函数,且没有任何类型的返回值,在创建对象时被自动调用。构造函数作为类的一个成员函数,具有一般成员函数所有的特性,它可以访问类的所有数据成员,可以是内联函数,可以带有参数表,还可以带默认的形参值。构造函数也可以重载,以提供初始化类对象的不同方法。,例如,前面定义的rectangle类的构造函数为rectangle(intxx,intyy,intw,inth)x=xx;y=yy;weight=w;high=h;每个类都必须有构造函数,若类定义时没有定义任何构造函数,编译器会自动生成一个不带参数的缺省构造函数,其形式如下::()/,2.拷贝构造函数定义拷贝构造函数的一般形式为:classclass_nameprivate:public:class_name(形式参数表);class_name(class_nameclass_name:class_name(class_namepublic:point(intxx=0,intyy=0),x=xx;y=yy;cout构造函数被调用endl;point(point,point:point(point,pointg()pointa(7,33);returna;voidmain(),pointa(15,22);pointb(a);coutb.get_x()b.get_y()endl;f(b);b=g();coutb.get_x()b.get_y()endl;,程序的运行结果为:构造函数被调用拷贝构造函数被调用1522拷贝构造函数被调用1522,析构函数被调用构造函数被调用拷贝构造函数被调用析构函数被调用析构函数被调用733析构函数被调用析构函数被调用,3.2.4类的组合C+中允许将一个已定义的类的对象作为另一个类的数据成员,我们称之为类的组合。,例如:ClassA;ClassBprivate:Aa;public:;,通常采用成员初始化列表的方法来初始化对象成员。下面给出组合类构造函数定义的一般形式::(形参表):对象成员1(形参表),对象成员2(形参表),类的初始化程序体其中,构造函数冒号后的部分“对象成员1(形参表),对象成员2(形参表),”称作成员初始化列表,用于完成对组合类中所包含的对象成员的初始化,该表列出了初始化各对象成员所使用的构造函数。,例3-2组合类中构造函数调用次序例题。#include#includeclasspointprivate:intx,y;public:point(inti=0,intj=0)x=i;y=j;point(point,point:point(point,public:distance(pointxp1,pointxp2);doubleget_dist()returndist;distance:distance(pointxp1,pointxp2):p1(xp1),p2(xp2)coutdistance构造函数被调用endl;doublex=double(p1.get_x()-p2.get_x();doubley=double(p1.get_y()-p2.get_y();dist=sqrt(x*x+y*y);,voidmain()pointmyp1(1,1),myp2(4,5);distancemyd(myp1,myp2);coutthedistanceis:;coutmyd.get_dist()endl;,程序运行结果为:point拷贝构造函数被调用point拷贝构造函数被调用point拷贝构造函数被调用point拷贝构造函数被调用distance构造函数被调用thedistanceis:5,3.2.5类模板声明类模板的一般形式为:templateclassclass_name,其中,Ttype是一个标识符,代表所声明的类模板中参数化的类型名。当实例化该通用类时,将由一个具体的类型代替它。若有多个参数化的类型名,可将它们依次罗列,用逗号隔开。可以看到,类模板的声明与通常的类定义没什么不同,只是以如下的首部开头:template上述首部表明这是一个类模板的定义。模板参数表由参数化的形式类型名组成,可以包含下列内容:class标识符,其中,标识符即为形式类型名,代表参数化的类型名。类型说明符标识符该标识符可以接受一个常量作为参数,常量的类型由“类型说明符”指定。注意:模板类的成员函数必须是函数模板。一旦定义了类模板,就可以用如下的语句创建这个类的实例:Class_name对象1,对象n;type为一个具体的数据类型名,与类模板声明中的形式类型名相对应,系统根据这个实际的数据类型生成所需的类,并创建该类的对象。下面通过一个简单的例子来了解类模板的使用。,例3-3类模板的使用例题。#include#includestructstudentintid;intscore;templateclassbuffer,private:Ta;intempty;public:buffer(void);Tget(void);voidput(Tx);,templatebuffer:buffer(void):empty(0)templateTbuffer:get(void)if(empty=0)coutthebufferisempty!endl;exit(1);returna;,templatevoidbuffer:put(Tx)empty+;a=x;voidmain(void)students=1022,78;bufferi1,i2;bufferstu1;bufferd;i1.put(13);,i2.put(-101);couti1.get()i2.get()endl;stu1.put(s);coutthestudentsidisstu1.get().idendl;coutthestudentsscoreisstu1.get().scoreendl;coutd.get()、.,例3-4string类的应用例题。#include#includeusingnamespacestd;voidmain()strings1(“Hello”),s2,s3,s4;/定义string对象s1、s2、s3、s4s2=s1;,/用=号进行赋值s3.assign(s1);/调用成员函数assign()进行赋值couts1=s1.data(),s2=s2.data(),s3=s3.data()endl;couts1的长度=s1.length()endl;/输出字符串长度,/string对象与字符数组chara=China!,b6;s1=a;/string对象s1接收字符数组a的赋值couts1=s1.data()endl;for(inti=0;i5;i+)bi=s2i;/此语句也可表示为:bi=s2.at(i);b5=0;,cout字符数组b=bendl;/字符串的连接s4=s2+s1;/用+进行字符串的连接(重载运算符+)s3=s2.append(s1);/s2与s1连接并赋给s3,注意连接后的s2结果couts2=s2.data(),s3=s3.data(),s4=s4.data()endl;/字符串的比较intf=pare(6,5,s4,7,5);/将s3的第6个开始的5个字符与s4的第7个开始的5个字符进行比较,if(f=0)couts3与s4比较的部分相等n;elsecouts3与s4比较的部分不相等n;/取子字符串操作stringsz=s2.substr(5,5);/取s2的第5个开始的5个字符cout子字符串sz=sz.data()endl;,/字符串的交换与查找,在s1中查找字符串China的位置(找不到为0)s1.swap(s4);/交换s1与s4couts1=s1.data(),s4=s4.data()endl;cout字符串China在s1中的位置为:s1.find(China)endl;/string字符串与char*型指针的转换intlen=s1.length();char*pt=newcharlen+1;/定义一个字符型指针变量并动态分配空间,s1.copy(pt,len,0);/将s1复制到pt所指的数组(相当于pt=,程序运行结果为:s1=Hello,s2=Hello,s3=Hellos1的长度=5s1=China!字符数组b=Hellos2=HelloChina!,s3=HelloChina!,s4=HelloChina!s3与s4比较的部分相等子字符串sz=Chinas1=HelloChina!,s4=China!字符串China在s1中的位置为6HelloChina!HelloChina!,3.3面向对象程序的结构,3.3.1作用域和生存期1.作用域1)函数原型作用域函数原型作用域是C+程序中最小的作用域。我们知道在函数原型的声明中一定要包含参数的类型声明,而形参则可以省略。这里参数的声明就属于函数原型作用域,它开始于函数原型声明的左括号“(”,结束于右括号“)”。例如,有如下函数声明:doubleArea(doublelength,doublewidth);,由于形参length和width只在括号之内有效,在程序的其他地方无法引用这个标识符,如果要引用,必须重新定义。因此,这里的标识符length和width实际上是可有可无的,省去它,也决不会影响到程序的编译和运行结果。例如:doubleArea(double,double);,2)块作用域块作用域又称局部作用域。当标识符的声明出现在由一对花括号“”所括起来的程序(块)内时,则此块中声明的标识符的作用域从声明处开始,一直到块结束的花括号为止。为了理解块作用域,我们来看一个例子:,#includevoidmain()voidfun1();intn;for(inti=0;i5;i+)intm;if(i%2)n+;m=n/2;/错误,m未定义n=i;fun1();/fun1()函数调用voidfun1()couti=iendl;/错误,i未定义,编译时,函数fun1()中的语句:couti=iendl;将出现一个未定义错误,这同样是因为试图在i作用域之外引用i。从这里可以看出,块作用域不能延伸到子函数中。3)文件作用域,#includeintk;voidmain()k=5;k+;coutk=kendl;,这里,在主函数之前声明的变量k具有文件作用域,它的有效作用范围是整个源代码文件。该程序运行结果为k=6可见性遵循的一般规则如下:(1)标识符在引用前必须先声明。(2)在互相没有包含关系的不同作用域中声明同名的标识符时,两标识符互不影响。(3)如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。,看下面的程序:#includeintk;voidmain()k=10;intk=5;coutk=kendl;coutk=kendl;,程序运行结果为:k=5k=102生存期1)静态生存期静态生存期与程序的运行期相同。静态生存期的变量只要程序一开始运行,它就存在,直到程序运行结束,此变量的生存期也就结束了。具有文件作用域的变量具有静态生存期。如果要在函数内部的块作用域中声明具有静态生存期的变量,则要使用关键字static。例如,下列语句声明的变量k便是具有静态生存期的变量,也称为静态变量。staticintk;,2)局部生存期在块作用域中声明的变量具有局部生存期。此生存期诞生于声明点,而终止于其作用域的结束处。因此,具有局部生存期的变量都具有块作用域。但反之则不然,一般具有块作用域的变量都具有局部生存期,但当在块作用域内将变量说明为静态变量时,该变量则具有静态生存期。例如:voidmain()staticintk;/,3)动态生存期动态生存期由程序中特定的函数(malloc()和free()调用或由操作符(new和delete)创建和释放。具有动态生存期的变量在内存的堆区分配空间。3局部变量和全局变量1)局部变量局部变量包括自动(auto)变量、内部静态(static)变量和函数参数。2)全局变量全局变量具有文件作用域。下面我们通过例3-5来说明各种变量的作用。,例3-5局部变量和全局变量例题。#includeinti=1;voidmain()staticinta;intb=-10;intc=0;voidother(void);cout-main-endl;,couti=ia=ab=bc=cendl;c=c+8;other();cout-main-endl;couti=ia=ab=bc=cendl;other();,voidother(void)staticinta=1;staticintb;intc=5;i=i+2;a=a+3;c=c+5;cout-other-endl;couti=ia=ab=bc=cendl;b=a;,程序运行结果为:-main-i=1a=0b=-10c=0-other-i=3a=4b=0c=10-main-i=3a=0b=-10c=8-other-i=5a=7b=4c=10,3.3.2静态成员静态成员用于解决同一个类的不同对象之间的数据和函数的共享问题。例如,我们可以抽象出学生的共性,设计如下的学生类:classStudentprivate:intStudentNo;intID;char*name;/;,1.静态数据成员静态数据成员声明和使用时应注意以下几点:(1)静态数据成员声明时,应在前面加static关键字来说明。例如:staticintn(2)静态数据成员必须初始化,并且一定要在类外进行,初始化的形式为:=例如:intPoint:n=0;,(3)静态数据成员属于类,而不属于任何一个对象,所以在类外只能通过类名对它进行引用,一般的引用形式为:;静态数据成员同一般数据成员一样要服从访问控制限制,当静态数据成员被声明为私有成员时,只能在类内直接引用它,在类外无法引用。但当静态数据成员被声明为公有成员或保护成员时,可以在类外通过类名对它进行引用。,2.静态函数成员下面我们通过例3-6来说明静态数据成员和静态函数成员的使用。例3-6使用静态数据成员和静态函数成员例题。#includeclasspointprivate:intx,y;staticintcountP;/静态数据成员,public:point(intxx=0,intyy=0)x=xx;y=yy;countP+;point(point,point:point(point/静态数据成员初始化voidmain(),point:get_c();/利用类名引用静态函数成员pointa(4,5);coutpointa,a.get_x(),a.get_y();a.get_c();/利用对象名引用静态函数成员pointb(a);coutpointb,b.get_x(),b.get_y();point:get_c();/利用类名引用静态函数成员,例3-6中,类point的数据成员countP被声明为静态,用来给point类的对象计数,每声明一个新对象,countP的值就相应加l。静态数据成员countP的定义和初始化在类外进行,countP的值是在类的构造函数中引用的。a对象生成时,调用有默认参数的构造函数。b对象生成时,调用拷贝构造函数。两次调用均访问的是a和b共同维护的该静态成员的拷贝。get_c()为静态函数成员,在主函数中,分别采用类名和对象名来调用get_c()。其中,第一次调用get_c()采用的是类名的形式,,此时,由于还没有任何对象生成,所以不能采用对象名的形式,而只能采用类名的形式。由此可见,通过类名调用静态函数成员可以输出静态数据成员的初始值。后面的两次get_c()的调用既可以采用类名的形式,也可以采用对象名的形式。程序运行结果为:Objectid=0pointa,4,5Objectid=1pointb,4,5Objectid=2,3.3.3友元1.友元函数如果友元是普通函数或类的成员函数,则称为友元函数。友元函数是在类声明中由关键字friend修饰的非成员函数。普通函数声明为友元函数的形式:friend(参数表)成员函数声明为友元函数的形式:friend:(参数表),说明:(1)友元函数的声明可以在类声明中的任何位置,既可在public区,也可在protected区,意义完全一样。(2)友元函数的定义一般放在类的外部,最好与类的其他成员函数定义放在一起。如果是普通函数作为友元,也可以放在类中。,例3-7使用普通函数作友元函数计算两点距离的例题。程序代码如下:#include#includeclasspointprivate:doublex,y;,public:point(doublexx=0,doubleyy=0)x=xx;y=yy;doubleget_x()returnx;doubleget_y()returny;frienddoubledistance(pointp1,pointp2);普通函数作point的友元;,doubledistance(pointp1,pointp2)return(sqrt(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);voidmain()pointmyp1(1,1),myp2(4,5);coutThedistanceis:distance(myp1,myp2)endl;,2.友元类如果友元是一个类,则称为友元类。友元类的声明形式为friendclass说明:(1)友元类的声明同样可以在类声明中的任何位置。(2)友元类的所有成员函数都成为友元函数。,例如,若A类为B类的友元类,即在B类中声明:friendclassA;则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。通过友元类声明,友元类的成员函数可以通过对象名直接访问到隐藏的数据,达到高效协调工作的目的。但在使用友元时还有两点需要注意:,(1)友元关系是不能传递的。B类是A类的友元,C类是B类的友元,C类和A类之间如果没有声明,就没有任何友元关系,不能进行数据共享。(2)友元关系是单向的。如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。,3.3.4常类型1.常引用使用const关键字声明的引用称为常引用,常引用所引用的对象不能被更新。常引用的声明形式为const说明:(1)const是加在函数声明后面的类型修饰符,它是函数类型的一个组成部分,因此在实现部分也要带const关键字。(2)const关键字可以被用于对重载函数的区分,例如,可以在类中这样声明:voidfun();voidfun()const;,(3)常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。(4)如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用其他成员函数。,例3-9常成员函数例题。#includeclassAprivate:intx,y;public:A(inti=0,intj=0)x=i;y=j;voidfun()/成员函数cout成员函数:x=x,y=yendl;voidfun()const/常成员函数cout常成员函数:x=x,y=yendl;,voidmain()Aobj1(1,2);/A类对象obj1.fun();constAobj2(3,4);/A类常对象obj2.fun();,在A类中说明了两个同名成员函数fun(),其中一个是常成员函数。在主函数中说明了两个对象obj1和obj2,对象obj2是常对象。通过对象obj1调用的是一般的成员函数,而通过对象obj2调用的是用const修饰的常成员函数。程序运行结果为:成员函数:x=1,y=2常成员函数:x=3,y=4,4.常数据成员例3-10常数据成员例题。#includeclassAprivate:constintx;/常数据成员staticconstinty;/静态常数据成员,public:constint,constintA:y=5;/静态常数据成员的初始化voidmain()Aobj1(1),obj2(2);obj1.fun();obj2.fun();,上述程序中说明了三个常数据成员:constintx;/常数据成员staticconstinty;/静态常数据成员constint/常引用程序中对静态常数据成员y的初始化是在类外进行的,其他两个常数据成员x和r的初始化则通过构造函数实现,注意构造函数中,冒号后面的就是数据成员的初始化列表。程序运行结果为:x=1,y=5,r=1x=2,y=5,r=2,3.3.5多文件结构但是大型程序都要分成多个文件,其理由是:(1)将相关类和函数放在一个特定的文件中,这样可以对不同的文件进行单独编写、编译,最后再连接,避免重复工作。(2)使程序更容易管理。按逻辑功能将程序分解成各源文件,便于程序员的任务安排。大型程序基本上由三个部分构成:类的声明、类成员的实现和主函数。,3.4动态内存分配,3.4.1new运算符new运算符用于动态分配一块内存空间。new运算符的使用形式为指针变量=new长度,例如:char*CBuffer=newchar256;/分配一个可以容纳256个char型数据的空间使用new运算符时,需要注意:(1)如果分配的空间长度为1个单位,则可以省略new运算符格式中的中括号和中括号中的整数,例如:float*pNum=newfloat;与float*pNum=newfloat1;等价。,(2)使用new运算符分配内存空间时,其空间长度可以是变量,也可以是数值表达式,例如:intnSize=5;int*nPInt=newintnSize+5;/分配一个可以容纳10个int型数据的空间,(3)由new分配的内存空间是连续的,可以通过指针的变化访问所分配空间的每一个元素,例如:int*nPInt=newint10;nPInt5=100;或*(nPInt+5)=100;(4)如果当前存储器无足够的内存空间可分配,则new运算符返回0(NULL)。,3.4.2delete运算符由new运算符分配的内存空间在使用完毕后应该使用delete运算符释放。delete运算符的使用有两种形式:delete指针delete指针例如:int*pInt=newint;deletepInt;int*pManyInt=newint10;deletepManyInt;,使用delete运算符时,需要注意:(1)用new运算符获得的内存空间,只许使用一次delete,不允许多次对同一块空间进行多次释放,否则将会产生严重错误。(2)delete只能用来释放由new运算符分配的动态内存空间,对于程序中的变量、数组的存储空间,不得使用delete运算符去释放。,3.4.3动态内存分配的应用实例1链表概述链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。一个简单的链表具有如图3-4所示的结构形式。,图3-4简单链表的结构形式,在C+中,实现一个单链表结构比较简单,例如可定义单链表结构的最简单形式:structNodeintdata;Node*next;,在此基础上,我们再定义一个链表类List,其中包含链表结点的插入、删除、输出等功能的成员函数。classListNode*head;public:List()head=NULL;voidInsertList(intaData,intbData);,/链表结点的插入voidDeleteList(intaData);/链表结点的删除voidOutputList();/链表结点的输出Node*Gethead()returnhead;,2链表结点的访问下面我们给出上述链表类的输出函数:voidList:OutputList()/链表输出函数Node*current=head;while(current!=NULL)coutdatanext;coutnext=NULL;elseif(p-data=aData)/若a是第一个结点s-next=p;head=s;,elsewhile(p-data!=aData,else/若没有结点ap-next=s;s-next=NULL;,4链表结点的删除如果要在链表中删除结点a,并释放被删除的结点所占的存储空间,则需要考虑下列几种情况:(1)若要删除的结点a是第一个结点,则把head指向a的下一个结点,如图3-6(a)所示。(2)若要删除的结点a存在于链表中,但不是第一个结点,则应使a的上一结点ak-1的指针域指向a的下一个结点ak+1,如图3-6(b)所示。(3)若空表或要删除的结点a不存在,则不作任何改变。,图3-6链表的删除,以下是链表类的结点删除函数:voidList:DeleteList(intaData)/设aData是要被删除结点a中的数据成员Node*p,*q;p=head;if(p=NULL)/若p为空return;if(p-data=aData)/若a是第一个结点,head=p-next;deletep;elsewhile(p-data!=aData,if(p-data=aData)/若有结点aq-next=p-next;deletep;,例3-11利用以上三个链表操作成员函数InsertList、DeleteList、OutputList,采用多文件结构,实现对链表的插入、删除和输出操作。#includestructNodeintdata;Node*next;,classListNode*head;public:List()head=NULL;voidInsertList(intaData,intbData);voidDeleteList(intaData);voidOutputList();Node*Gethead()returnhead;,voidmain()ListA,B;/定义两个链表对象intdata10=25,41,16,98,5,67,9,55,1,121;A.InsertList(0,data0);/建立链表A首结点for(inti=1;i10;i+)A.InsertList(0,datai);/顺序向后插入coutn链表A:;,A.OutputList();A.DeleteList(data7);coutdata,datai);,coutn链表B:;B.OutputList();B.DeleteList(67);cout删除元素67后:n;B.OutputList();,程序运行结果为:链表A:254116985679551121删除元素data7后:2541169856791121链表B:121155967598164125删除元素67后:1559598164125,习题,3-1填空题(1)生存期与存储区域关系密切,一般存储区域分为代码区(codearea)、数据区域(dataarea)、栈区(stackarea)和堆区(heaparea)。代码区用来存放,与其他存储区相对应的生存期分别为、和。(2)局部变量一般具有作用域,还可能具有作用域;全局变量具有作用域。,(3)静态成员属于,而不属于,它由同一个类的所有对象共同维护,为这些对象所共享。静态函数成员可以直接引用该类的和函数成员,而不能直接引用。对于公有的静态函数成员,可以通过或来调用;而一般的非静态函数成员只能通过对象名来调用。(4)在实际程序设计中,一个源程序可划分为三个文件:、和。,3-2简答题(1)面向对象程序设计的特点是什么?(2)构造函数和析构函数有什么作用?(3)什么叫拷贝构造函数?拷贝构造函数何时被调用?(4)什么叫组合类?(5)常用的常类型都有哪几种?试分别举例说明。(6)什么叫可见性?可见性遵循的一般规则是什么?(7)什么叫友元函数?什么叫友元类?,3-3阅读程序题(1)以下是一个类中包含另一个类对象成员(类的组合)的例子,试分析并给出以下程序的运行结果。#includeclassSonintage;public:Son()age=1;Son(inti)age=i;voidprint()cout儿子的年龄是:ageendl;,classFatherintage;Sons1,s2;public:Father(inta1,inta2,intf):s2(a2),s1(a1)age=f;,voidprint()cout父亲的年龄是:ages2.age)return1;elseif(s1.age=s2.age)return0;elsereturn-1;,voidmain()st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 动物的营养需要
- 生物物种安全保护体系建设
- 皮肤科湿疹药物治疗须知
- 职场沟通的技巧与方法
- 幼师教育家精神演讲稿
- 实习员工实习报告
- 2025版前列腺癌常见症状及护理方法指南
- 手环心率测试原理
- 脑卒中宣教护理品管圈
- 脑出血患者入院宣教
- 2025年骨干教师考试题库及答案
- 2025年新版运营管理自考试题及答案
- DB11∕T 1010-2019 信息化项目软件开发费用测算规范
- 生物安全知识培训
- 初中语文第7课《藤野先生》课件+统编版语文八年级上册
- 卫星通讯基础知识
- 志愿交通安全培训要点
- 2025-2026学年人教版(2024)初中体育与健康八年级全一册《兴趣伴成长》教学设计
- 幼儿园中班语言《恐龙妈妈藏蛋》课件
- 规范垂直大模型质量验收规程
- 蒙古族民俗风情
评论
0/150
提交评论