《2023年计算机二级C考试复习资料.doc》由会员分享,可在线阅读,更多相关《2023年计算机二级C考试复习资料.doc(88页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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);return 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对象时,编译器会把该函数当作转换构造函数来调用。但是有时
限制150内