2022计算机二级C考试复习资料

上传人:仙*** 文档编号:130954432 上传时间:2022-08-05 格式:DOC 页数:85 大小:108.50KB
收藏 版权申诉 举报 下载
2022计算机二级C考试复习资料_第1页
第1页 / 共85页
2022计算机二级C考试复习资料_第2页
第2页 / 共85页
2022计算机二级C考试复习资料_第3页
第3页 / 共85页
资源描述:

《2022计算机二级C考试复习资料》由会员分享,可在线阅读,更多相关《2022计算机二级C考试复习资料(85页珍藏版)》请在装配图网上搜索。

1、计算机二级C+考试复习资料(全)一、C+概述(一) 发展历史 1980年,Bjarne Stroustrup博士开始着手创立一种模仿语言,可以具有面向对象程序设计特色。在当时,面向对象编程还是一种比较新理念,Stroustrup博士并不是从头开始设计新语言,而是在C语言基本上进行创立。这就是C+语言。1985年,C+开始在外面慢慢流行。通过近年发展,C+已有了多种版本。为次,ANSI和ISO联合委员会于1989年着手为C+制定原则。1994年2月,该委员会出版了第一份非正式草案,1998年正式推出了C+国际原则。(二) C和C+C+是C超集,也可以说C是C+子集,由于C先浮现。按常理说,C+编

2、译器可以编译任何C程序,但是C和C+还是有某些小差别。例如C+增长了C不具有核心字。这些核心字能作为函数和变量标记符在C程序中使用,尽管C+涉及了所有C,但显然没有任何C+编译器能编译这样C程序。C程序员可以省略函数原型,而C+不可以,一种不带参数C函数原型必要把void写出来。而C+可以使用空参数列表。C+中new和delete是对内存分派运算符,取代了C中malloc和free。原则C+中字符串类取代了C原则C函数库头文献中字符数组解决函数。C+中用来做控制态输入输出iostream类库替代了原则C中stdio函数库。C+中try/catch/throw异常解决机制取代了原则C中setjm

3、p()和longjmp()函数。二、核心字和变量C+相对与C增长了某些核心字,如下:typename bool dynamic_cast mutable namespacestatic_cast using catch explicit newvirtual operator false private templatevolatile const protected this wchar_tconst_cast public throw friend truereinterpret_cast trybitor xor_e and_eq compl or_eqnot_eq bitand在C+中

4、还增长了bool型变量和wchar_t型变量:布尔型变量是有两种逻辑状态变量,它涉及两个值:真和假。如果在体现式中使用了布尔型变量,那么将根据变量值真假而赋予整型值1或0。要把一种整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布儿型变量在运营时通常用做标志,例如进行逻辑测试以变化程序流程。#include iostream.hint main()bool flag;flag=true;if(flag) cout return 0;C+中还波及wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位数据类型。许多外文字符集所

5、含数目超过256个,char字符类型无法完全囊括。wchar_t数据类型一般为16位。原则C+iostream类库中波及了可以支持宽字符类和对象。用wout替代cout即可。#include iostream.hint main()wchar_t wc;wc=b;wout wc=y;wout wc=e;wout return 0;阐明一下:某些编译器无法编译该程序(不支持该数据类型)。三、强制类型转换有时候,根据体现式需要,某个数据需要被当成此外数据类型来解决,这时,就需要强制编译器把变量或常数由声明时类型转换成需要类型。为此,就要使用强制类型转换阐明,格式如下:int* iptr=(int*

6、) &table;体现式前缀(int*)就是老式C风格强制类型转换阐明(typecast),又可称为强制转换阐明(cast)。强制转换阐明告诉编译器把体现式转换成指定类型。有些状况下强制转换是禁用,例如不能把一种构造类型转换成其她任何类型。数字类型和数字类型、指针和指针之间可以互相转换。固然,数字类型和指针类型也可以互相转换,但一般觉得这样做是不安全并且也是没必要。强制类型转换可以避免编译器警告。long int el=123;short i=(int) el;float m=34.56;int i=(int) m;上面两个都是C风格强制类型转换,C+还增长了一种转换方式,比较一下上面和下面这

7、个书写方式不同:long int el=123;short i=int (el);float m=34.56;int i=int (m);使用强制类型转换最大好处就是:严禁编译器对你故意去做事发出警告。但是,运用强制类型转换阐明使得编译器类型检查机制失效,这不是明智选用。一般,是不倡导进行强制类型转换。除非不可避免,如要调用malloc()函数时要用void型指针转换成指定类型指针。四、原则输入输出流在C语言中,输入输出是使用语句scanf()和printf()来实现,而C+中是使用类来实现。#include iostream.hmain() /C+中main()函数默觉得int型,而C语言中

8、默觉得void型。int a;couta;/*输入一种数值*/cout return 0;cin,cout,endl对象,她们自身并不是C+语言构成某些。虽然她们已经是ANSI原则C+中被定义,但是她们不是语言内在构成某些。在C+中不提供内在输入输出运算符,这与其她语言是不同。输入和输出是通过C+类来实现,cin和cout是这些类实例,她们是在C+语言外部实现。在C+语言中,有了一种新注释措施,就是/,在该行/后所有阐明都被编译器觉得是注释,这种注释不能换行。C+中仍然保存了老式C语言注释风格/*/。C+也可采用格式化输出措施:#include iostream.hint main()int

9、a;couta;cout五、函数重载在C+中,容许有相似函数名,但是它们参数类型不能完全相似,这样这些函数就可以互相区别开来。而这在C语言中是不容许。1.参数个数不同#include iostream.hvoid a(int,int);void a(int);int main()a(5);a(6,7);return 0;void a(int i)cout void a(int i,int j)cout 2.参数格式不同#include iostream.hvoid a(int,int);void a(int,float);int main()a(5,6);a(6,7.0);return 0;v

10、oid a(int i,int j)cout void a(int i,float j)couta;for(int i=1;i=10;i+) /C语言中,不容许在这里定义变量static int a=0;/C语言中,同一函数块,不容许有同名变量a+=i;cout:a return 0;七、new和delete运算符在C+语言中,仍然支持malloc()和free()来分派和释放内存,同步增长了new和delete来管理内存。1.为固定大小数组分派内存#include iostream.hint main()int *birthday=new int3;birthday0=6;birthday1

11、=24;birthday2=1940;cout size;int *array=new intsize;for(int i=0;i arrayi=rand();for(i=0;i coutn delete array;return 0;八、引用型变量在C+中,引用是一种常常使用概念。引用型变量是其她变量一种别名,我们可以觉得她们只是名字不相似,其她都是相似。1.引用是一种别名C+中引用是其她变量别名。声明一种引用型变量,需要给她一种初始化值,在变量生存周期内,该值不会变化。& 运算符定义了一种引用型变量:int a;int& b=a;先声明一种名为a变量,它尚有一种别名b。我们可以觉得是一种人

12、,有一种真名,一种外号,后来不管是喊她a还是b,都是叫她这个人。同样,作为变量,后来对这两个标记符操作都会产生相似效果。#include iostream.hint main()int a=123;int& b=a;cout a+;cout b+;cout等运算符#include iostream.hvoid func1(s p);void func2(s& p);struct sint n;char text10;int main()static s str=123,China;func1(str);func2(str);return 0;void func1(s p)cout cout v

13、oid func2(s& p)cout cout 从表面上看,这两个函数没有明显区别,但是她们所花时间却有很大差别,func2()函数所用时间开销会比func2()函数少诸多。它们尚有一种差别,如果程序递归func1(),随着递归进一步,会由于栈耗尽而崩溃,但func2()没有这样担忧。4.以引用方式调用当函数把引用作为参数传递给另一种函数时,被调用函数将直接对参数在调用者中拷贝进行操作,而不是产生一种局部拷贝(传递变量自身是这样)。这就称为以引用方式调用。把参数值传递到被调用函数内部拷贝中则称为以传值方式调用。#include iostream.hvoid display(const Dat

14、e&,const char*);void swapper(Date&,Date&);struct Dateint month,day,year;int main()static Date now=2,23,90;static Date then=9,10,60;display(now,Now:);display(then,Then:);swapper(now,then);display(now,Now:);display(then,Then:);return 0;void swapper(Date& dt1,Date& dt2)Date save;save=dt1;dt1=dt2;dt2=sa

15、ve;void display(const Date& dt,const char *s)cout cout 5.以引用作为返回值#include iostream.hstruct Dateint month,day,year;Date birthdays=12,12,60;10,25,85;5,20,73;const Date& getdate(int n)return birthdaysn-1;int main()int dt=1;while(dt!=0)coutdt;if(dt0 & dt4)const Date& bd=getdate(dt);cout return 0;程序都很简朴,

16、就不解说了C+辅导笔记:类设计、构造函数和析构函数一、类设计1.类声明class 类名private:/私有.public:/公有.;2.类成员一般在C+类中,所有定义变量和函数都是类成员。如果是变量,我们就叫它数据成员如果是函数,我们就叫它成员函数。3.类成员可见性private和public访问控制符决定了成员可见性。由一种访问控制符设定可访问状态将始终持续到下一种访问控制符浮现,或者类声明结束。私有成员仅能被同一种类中成员函数访问,公有成员既可以被同一类中成员函数访问,也可以被其她已经实例化类中函数访问。固然,这也有例外状况,这是后来要讨论友元函数。类中默认数据类型是private,构造

17、中默认类型是public。一般状况下,变量都作为私有成员浮现,函数都作为公有成员浮现。类中尚有一种访问控制符protected,叫保护成员,后来再阐明。4.初始化在声明一种类对象时,可以用圆括号()涉及一种初始化表。看下面一种例子:#include iostream.hclass Boxprivate:int height,width,depth;/3个私有数据成员public:Box(int,int,int);Box();int volume();/成员函数;Box:Box(int ht,int wd,int dp)height=ht;width=wd;depth=dp;Box:Box()/

18、nothingint Box:volume()return height*width*depth;int main()Box thisbox(3,4,5);/声明一种类对象并初始化cout return 0;当一种类中没有private成员和protected成员时,也没有虚函数,并且不是从其她类中派生出来,可以用来初始化。(后来再解说)5.内联函数内联函数和一般函数区别是:内联函数是在编译过程中展开。一般内联函数必要简短。定义类内联函数有两种措施:一种和C语言同样,在定义函数时使用核心字inline。如:inline int Box:volume()return height*width*d

19、epth;尚有一种措施就是直接在类声明内部定义函数体,而不是仅仅给出一种函数原型。我们把上面函数简化一下:#include iostream.hclass Boxprivate:int height,width,depth;public:Box(int ht,int wd,int dp)height=ht;width=wd;depth=dp;Box();int volume()return height*width*depth;int main()Box thisbox(3,4,5);/声明一种类对象并初始化cout return 0;这样,两个函数都默觉得内联函数了。二、构造函数什么是构造函

20、数?通俗讲,在类中,函数名和类名相似函数称为构造函数。上面Box()函数就是构造函数。C+容许同名函数,也就容许在一种类中有多种构造函数。如果一种都没有,编译器将为该类产生一种默认构造函数,这个构造函数也许会完毕某些工作,也也许什么都不做。绝对不能指定构造函数类型,虽然是void型都不可以。事实上构造函数默觉得void型。当一种类对象进入作用域时,系统会为其数据成员分派足够内存,但是系统不一定将其初始化。和内部数据类型对象同样,外部对象数据成员总是初始化为0。局部对象不会被初始化。构造函数就是被用来进行初始化工作。当自动类型类对象离开其作用域时,所站用内存将释放回系统。看上面例子,构造函数Bo

21、x()函数接受三个整型擦黑素,并把她们赋值给立方体对象数据成员。如果构造函数没有参数,那么声明对象时也不需要括号。1.使用默认参数构造函数当在声明类对象时,如果没有指定参数,则使用默认参数来初始化对象。#include iostream.hclass Boxprivate:int height,width,depth;public:Box(int ht=2,int wd=3,int dp=4)height=ht;width=wd;depth=dp;Box();int volume()return height*width*depth;int main()Box thisbox(3,4,5);/

22、初始化Box defaulbox;/使用默认参数cout coutreturn 0;2.默认构造函数没有参数或者参数都是默认值构造函数称为默认构造函数。如果你不提供构造函数,编译器会自动产生一种公共默认构造函数,这个构造函数什么都不做。如果至少提供一种构造函数,则编译器就不会产生默认构造函数。3.重载构造函数一种类中可以有多种构造函数。这些构造函数必要具有不同参数表。在一种类中需要接受不同初始化值时,就需要编写多种构造函数,但有时候只需要一种不带初始值空Box对象。#include iostream.hclass Boxprivate:int height,width,depth;public

23、:Box() /nothing Box(int ht=2,int wd=3,int dp=4)height=ht;width=wd;depth=dp;Box();int volume()return height*width*depth;int main()Box thisbox(3,4,5);/初始化Box otherbox;otherbox=thisbox;cout return 0;这两个构造函数一种没有初始化值,一种有。当没有初始化值时,程序使用默认值,即2,3,4。但是这样程序是不好。它容许使用初始化过和没有初始化过Box对象,但它没有考虑当thisbox给otherbox赋值失败后

24、,volume()该返回什么。较好措施是,没有参数表构造函数也把默认值赋值给对象。class Boxint height,width,depth;public:Box()height=0;width=0;depth=0;Box(int ht,int wd,int dp)height=ht;width=wd;depth=dp;int volume()return height*width*depth;这还不是最佳措施,更好措施是使用默认参数,主线不需要不带参数构造函数。class Boxint height,width,depth;public:Box(int ht=0,int wd=0,int

25、 dp=0)height=ht;width=wd;depth=dp;int volume()return height*width*depth;三、析构函数当一种类对象离开作用域时,析构函数将被调用(系统自动调用)。析构函数名字和类名同样,但是要在前面加上 。对一种类来说,只能容许一种析构函数,析构函数不能有参数,并且也没有返回值。析构函数作用是完毕一种清理工作,如释放从堆中分派内存。我们也可以只给出析构函数形式,而不给出起具体函数体,其效果是同样,如上面例子。但在有些状况下,析构函数又是必须。如在类中从堆中分派了内存,则必要在析构函数中释放二级C+辅导笔记:类转换C+内部数据类型遵循隐式类型

26、转换规则。假设某个体现市中使用了一种短整型变量,而编译器根据上下文觉得这儿需要是长整型,则编译器就会根据类型转换规则自动把它转换成长整型,这种隐式转换出目前赋值、参数传递、返回值、初始化和体现式中。我们也可觉得类提供相应转换规则。对一种类建立隐式转换规则需要构造一种转换函数,该函数作为类成员,可以把该类对象和其她数据类型对象进行互相转换。声明了转换函数,就告诉了编译器,当根据句法鉴定需要类型转换时,就调用函数。有两种转换函数。一种是转换构造函数;另一种是成员转换函数。需要采用哪种转换函数取决于转换方向。一、转换构造函数当一种构造函数仅有一种参数,且该参数是不同于该类一种数据类型,这样构造函数就

27、叫转换构造函数。转换构造函数把别数据类型对象转换为该类一种对象。和其她构造函数同样,如果声明类对象初始化表同转换构造函数参数表相匹配,该函数就会被调用。当在需要使用该类地方使用了别数据类型,便宜器就会调用转换构造函数进行转换。#include iostream.h#include time.h#include stdio.hclass Dateint mo,da,yr;public:Date(time_t);void display();void Date:display()char year5;if(yr10)sprintf(year,0%d,yr);elsesprintf(year,%d,

28、yr);couttm_mday;mo=tim-tm_mon+1;yr=tim-tm_year;if(yr=100) yr-=100;int main()time_t now=time(0);Date dt(now);dt.display();return 0;本程序先调用time()函数来获取目前时间,并把它赋给time_t对象;然后程序通过调用Date类转换构造函数来创立一种Date对象,该对象由time_t对象转换而来。time_t对象先传递给localtime()函数,然后返回一种指向tm构造(time.h文献中声明)指针,然后构造函数把构造中日月年数值拷贝给Date对象数据成员,这就完

29、毕了从time_t对象到Date对象转换。二、成员转换函数成员转换函数把该类对象转换为其她数据类型对象。在成员转换函数声明中要用到核心字operator。这样声明一种成员转换函数:operator aaa();在这个例子中,aaa就是要转换成数据类型阐明符。这里类型阐明符可以是任何合法C+类型,波及其她类。如下来定义成员转换函数;Classname:operator aaa()类名标记符是声明了该函数类类型阐明符。上面定义Date类并不能把该类对象转换回time_t型变量,但可以把它转换成一种长整型值,计算从1月1日到目前天数。#include iostream.hclass Dateint

30、mo,da,yr;public:Date(int m,int d,int y) mo=m;da=d;yr=y;operator int();/声明;Date:operator int() /定义static int dys=31,28,31,30,31,30,31,31,30,31,30,31;int days=yr-;days*=365;days+=(yr-)/4;for(int i=0;i days+=dysi;days+=da;return days;int main()Date now(12,24,);int since=now;cout return 0;三、类转换上面两个例子都是C

31、+类对象和内部数据对象之间互相转换。也可以定义转换函数来实现两个类对象之间互相转换。#include iostream.hclass CustomDatepublic:int da,yr;CustomDate(int d=0,int y=0) da=d;yr=y;void display()cout ;class Dateint mo,da,yr;public:Date(int m=0,int d=0,int y=0) mo=m;da=d;yr=y;Date(const CustomDate&);/转换构造函数operator CustomDate();/成员转换函数void display(

32、)cout ;static int dys = 31,28,31,30,31,30,31,31,30,31,30,31;Date:Date(const CustomDate& jd)yr=jd.yr;da=jd.da;for(mo=0;modysmo) da-=dysmo;else break;mo+;Date:operator CustomDate()CustomDate cd(0,yr);for(int i=0;i cd.da+=da;return cd;int main()Date dt(12,24,3);CustomDate cd;cd = dt;/调用成员转换函数cd.display

33、();dt = cd;/调用转换构造函数dt.display();return 0;这个例子中有两个类CustomDate和Date,CustomDate型日期涉及年份和天数。这个例子没有考虑闰年状况。但是在实际构造一种类时,应当考虑到所有问题也许性。在Date里中具有两种转换函数,这样,当需要从Date型变为CustomDate型十,可以调用成员转换函数;反之可以调用转换构造函数。不能既在Date类中定义成员转换函数,又在CustomDate类里定义转换构造函数。那样编译器在进行转换时就不懂得该调用哪一种函数,从而出错.四、转换函数调用C+里调用转换函数有三种形式:第一种是隐式转换,例如编译

34、器需要一种Date对象,而程序提供是CustomDate对象,编译器会自动调用合适转换函数。此外两种都是需要在程序代码中明确给出显式转换。C+强制类型转换是一种,尚有一种是显式调用转换构造函数和成员转换函数。下面程序给出了三中转换形式:#include iostream.hclass CustomDatepublic:int da,yr;CustomDate(int d=0,int y=0) da=d;yr=y;void display()cout ;class Dateint mo,da,yr;public:Date(int m,int d,int y)mo=m;da=d;yr=y;oper

35、ator CustomDate();Date:operator CustomDate()static int dys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDate cd(0,yr);for(int i=0;i cd.da+=da;return cd;int main()Date dt(11,17,89);CustomDate cd;cd = dt;cd.display();cd = (CustomDate) dt;cd.display();cd = CustomDate(dt);cd.display();return 0;五、转换发生情形上面几种

36、例子都是通过不能类型对象之间互相赋值来调用转换函数,尚有几种调用也许:参数传递初始化返回值体现式语句这些状况下,均有也许调用转换函数。下面程序不难理解,就不分析了。#include iostream.hclass CustomDatepublic:int da,yr;CustomDate() CustomDate(int d,int y) da=d;yr=y;void display()cout ;class Dateint mo,da,yr;public:Date(int m,int d,int y) mo=m;da=d;yr=y;operator CustomDate();Date:ope

37、rator CustomDate()static int dys=31,28,31,30,31,30,31,31,30,31,30,31;CustomDate cd(0,yr);for (int i=0;i cd.da+=da;return cd;class TesterCustomDate cd;public:explicit Tester(CustomDate c) cd=c;void display() cd.display();;void dispdate(CustomDate cd)cd.display();CustomDate rtndate()Date dt(9,11,1);re

38、turn dt;int main()Date dt(12,24,3);CustomDate cd;cd = dt;cd.display();dispdate(dt);Tester ts(dt);ts.display();cd = rtndate();cd.display();return 0;六、显式构造函数注意上面Tester类构造函数前面有一种explicit修饰符。如果不加上这个核心字,那么在需要把CustomDate对象转换成Tester对象时,编译器会把该函数当作转换构造函数来调用。但是有时候,并不想把这种只有一种参数构造函数用于转换目,而仅仅但愿用它来显式地初始化对象,此时,就需要

39、在构造函数前加explicit。如果在声明了Tester对象后来使用了下面语句将导致一种错误:ts=jd;/error这个错误阐明,虽然Tester类中有一种以Date型变量为参数构造函数,编译器却不会把它看作是从Date到Tester转换构造函数,由于它声明中涉及了explicit修饰符。七、体现式内部转换在体现式内部,如果发现某个类型和需要不一致,就会发生错误。数字类型转换是很简朴,这里就不举例了。下面程序是把Date对象转换成长整型值。#include iostream.hclass Dateint mo,da,yr;public:Date(int m,int d,int y)mo=m;

40、da=d;yr=y;operator long();Date:operator long()static int dys=31,28,31,30,31,30,31,31,30,31,30,31;long days=yr;days*=365;days+=(yr-1900)/4;/从191月1日开始计算for(int i=0;i days+=da;return days;int main()Date today(12,24,);const long ott=123;long sum=ott+today;cout return 0;在体现式中,当需要转换对象可以转换成某个数字类型,或者体现式调用了作

41、用于某个类重载运算符时,就会发生隐式转换。运算符重载后来再学习二级C+辅导笔记:私有数据成员和友元一、私有数据成员使用1.取值和赋值成员函数面向对象商定就是保证所有数据成员私有性。一般我们都是通过公有成员函数来作为公共接口来读取私有数据成员。某些时候,我们称这样函数为取值和赋值函数。取值函数返回值和传递给赋值函数参数不必一一匹配所有数据成员类型。#include iostream.hclass Dateint mo,da,yr;public:Date(int m,int d,int y) mo=m;da=d;yr=y;int getyear() const return yr;void set

42、year(int y) yr = y;;int main()Date dt(4,1,89);cout dt.setyear(97);cout return 0;上面例子很简朴,不分析了。要养成这样习惯,通过成员函数来访问和变化类中数据。这样有助于软件设计和维护。例如,变化Date类内部数据形式,但仍然用修改正getyear()和setyear()来提供访问接口,那么使用该类就不必修改她们代码,仅需要重新编译程序即可。2.常量成员函数注意上面程序中getyear()被声明为常量型,这样可以保证该成员函数不会修改调用她对象。通过加上const修饰符,可以使访问对象数据成员函数仅仅完毕不会引起数据变

43、动那些操作。如果程序声明某个Date对象为常量话,那么该对象不得调用任何非常量型成员函数,无论这些函数与否真试图修改对象数据。只有把那些不会引起数据变化函数都声明为常量型,才可以让常量对象来调用。3.改善成员转换函数下面程序改善了从Date对象到CustomDate对象成员转换函数,用取值和赋值函数取代了使用公有数据成员做法。(此前程序代码在上一帖中)#include iostream.hclass CustomDateint da,yr;public:CustomDate() CustomDate(int d,int y) da=d;yr=y;void display() const cou

44、t int getday() const return da;void setday(int d) da=d;;class Dateint mo,da,yr;public:Date(int m,int d,int y) mo=m;da=d;yr=y;operator CustomDate() const;Date:operator CustomDate() conststatic int dys = 31,28,31,30,31,30,31,31,30,31,30,31;CustomDate cd(0,yr);int day=da;for(int i=0;i cd.setday(day);re

45、turn cd;int main()Date dt(11,17,89);CustomDate cd;cd=dt;cd.display();return 0;注意上面程序中Date:operator CustomDate()声明为常量型,由于这个函数没有变化调用它对象数据,尽管它修改了一种临时CustomDate对象并将其作为函数返回值。二、友元前面已经说过了,私有数据成员不能被类外其她函数读取,但是有时候类会容许某些特殊函数直接读写其私有数据成员。核心字friend可以让特定函数或者别类所有成员函数对私有数据成员进行读写。这既可以维护数据私有性,有可以保证让特定类或函数可以直接访问私有数据。1

46、.友元类一种类可以声明另一种类为其友元,这个友元所有成员函数都可以读写它私有数据。#include iostream.hclass Date;class CustomDateint da,yr;public:CustomDate(int d=0,int y=0) da=d;yr=y;void display() const cout friend Date;/这儿;class Dateint mo,da,yr;public:Date(int m,int d,int y) mo=m;da=d;yr=y;operator CustomDate();Date:operator CustomDate(

47、)static int dys = 31,28,31,30,31,30,31,31,30,31,30,31;CustomDate cd(0,yr);for (int i=0;i cd.da+=da;return cd;int main()Date dt(11,17,89);CustomDate cd(dt);cd.display();return 0;在上面程序中,有这样一句 friend Date;该语句告诉编译器,Date类所有成员函数有权访问CustomDate类私有成员。由于Date类转换函数需要懂得CustomDate类每个数据成员,因此真个Date类都被声明为CustomDate类

48、友元。2.隐式构造函数上面程序对CustomDate构造函数调用私有显示该类需要如下一种转换构造函数:CustomDate(Date& dt);但是唯一一种构造函数是:CustomDate(int d=0;int y=0);这就浮现了问题,编译器要从Date对象构造一种CustomDate对象,但是CustomDate类中并没有定义这样转换构造函数。但是Date类中定义了一种成员转换函数,它可以把Date对象转换成CustomDate对象。于是编译器开始搜索CustomDate类,看其与否有一种构造函数,能从一种已存在CustomDate对象创立新CustomDate对象。这种构造函数叫拷贝构

49、造函数。拷贝构造函数也只有一种参数,该参数是它所属类一种对象,由于CustomDate类中没有拷贝构造函数,于是编译器就会产生一种默认拷贝构造函数,该函数简朴地把已存在对象每个成员拷贝给新对象。目前我们已经懂得,编译器可以把Date对象转换成CustomDate对象,也可以从已存在CustomDate对象生成一种新CustomDate对象。那么上面提出问题,编译器就是这样做:它一方面调用转换函数,从Date对象创立一种隐藏、临时、匿名CustomDate对象,然后用该临时对象作为参数调用默认拷贝构造函数,这就生成了一种新CustomDate对象。3.预引用上面例子中尚有这样一句 class D

50、ate;这个语句叫做预引用。它告诉编译器,类Date将在背面定义。编译器必要懂得这个信号,由于CustomDate类中引用了Date类,而Date里也引用了CustomDate类,必要一方面声明其中之一。使用了预引用后,就可以声明未定义类友元、指针和引用。但是不可以使用那些需要懂得预引用类定义细节语句,如声明该类一种实例或者任何对该类成员引用。4.显式友元预引用也可以不使用预引用,这只要在声明友元时候加上核心自class就行了。#include iostream.hclass CustomDateint da,yr;public:CustomDate(int d=0,int y=0) da=d

51、;yr=y;void display() const cout friend class Date;/这儿,去掉前面预引用;class Date. .;Date:operator CustomDate(). .int main(). .5.友元函数一般,除非真需要,否则并不需要把整个类都设为另一种类友元,只需挑出需要访问目前类私有数据成员成员函数,将它们设立为该类友元即可。这样函数称为友元函数。下面程序限制了CustomDate类数据成员访问,Date类中只有需要这些数据成员函数才有权读写它们。#include iostream.hclass CustomDate;class Dateint mo,da,yr;public:Date(const CustomDate&);void display() const cout ;class CustomDateint da,yr;public:CustomDate(int d=0,int y=0) da=d;yr=y;friend Date:Date(const CustomDate&);Date:Date(const CustomDate& cd)stati

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!