全国计算机二级C++考试复习知识点汇总.docx
- 文档编号:12833669
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:24
- 大小:21.93KB
全国计算机二级C++考试复习知识点汇总.docx
《全国计算机二级C++考试复习知识点汇总.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C++考试复习知识点汇总.docx(24页珍藏版)》请在冰豆网上搜索。
全国计算机二级C++考试复习知识点汇总
2017年全国计算机二级C++考试复习学问点汇总
一、C++概述
(一)开展历史
1980年,BjarneStroustrup博士起先着手创立一种模拟语言,能够具有面对对象的程序设计特色。
在当时,面对对象编程还是一个比拟新的理念,Stroustrup博士并不是从头起先设计新语言,而是在C语言的根底上进展创立。
这就是C++语言。
1985年,C++起先在外面渐渐流行。
经过多年的开展,C++已经有了多个版本。
为次,ANSI和ISO的联合委员会于1989年着手为C++制定标准。
1994年2月,该委员会出版了第一份非正式草案,1998年正式推出了C++的国际标准。
(二)C和C++
C++是C的超集,也可以说C是C++的子集,因为C先出现。
按常理说,C++编译器能够编译任何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中的setjmp()和longjmp()函数。
二、关键字和变量
C++相对和C增加了一些关键字,如下:
typenamebooldynamic_castmutablenamespace
static_castusingcatchexplicitnew
virtualoperatorfalseprivatetemplate
volatileconstprotectedthiswchar_t
const_castpublicthrowfriendtrue
reinterpret_casttry
bitorxor_eand_eqcomplor_eq
not_eqbitand
在C++中还增加了bool型变量和wchar_t型变量:
布尔型变量是有两种逻辑状态的变量,它包含两个值:
真和假。
假如在表达式中运用了布尔型变量,那么将依据变量值的真假而给予整型值1或0。
要把一个整型变量转换成布尔型变量,假如整型值为0,那么其布尔型值为假;反之假如整型值为非0,那么其布尔型值为真。
布儿型变量在运行时通常用做标记,比方进展逻辑测试以变更程序流程。
#includeiostream.h
intmain()
{
boolflag;
flag=true;
if(flag)cout } C++中还包括wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位的数据类型。 很多外文字符集所含的数目超过256个,char字符类型无法完全囊括。 wchar_t数据类型一般为16位。 标准C++的iostream类库中包括了可以支持宽字符的类和对象。 用wout替代cout即可。 #includeiostream.h intmain() { wchar_twc; wc='b'; wout wout wout } 说明一下: 某些编译器无法编译该程序(不支持该数据类型)。 三、强制类型转换 有时候,依据表达式的须要,某个数据须要被当成另外的数据类型来处理,这时,就须要强制编译器把变量或常数由声明时的类型转换成须要的类型。 为此,就要运用强制类型转换说明,格式如下: int*iptr=(int*)&table; 表达式的前缀(int*)就是传统C风格的强制类型转换说明(typecast),又可称为强制转换说明(cast)。 强制转换说明告知编译器把表达式转换成指定的类型。 有些状况下强制转换是禁用的,例如不能把一个构造类型转换成其他任何类型。 数字类型和数字类型、指针和指针之间可以相互转换。 当然,数字类型和指针类型也可以相互转换,但通常认为这样做是担心全而且也是没必要的。 强制类型转换可以幸免编译器的警告。 longintel=123; shorti=(int)el; floatm=34.56; inti=(int)m; 上面两个都是C风格的强制类型转换,C++还增加了一种转换方式,比拟一下上面和下面这个书写方式的不同: longintel=123; shorti=int(el); floatm=34.56; inti=int(m); 运用强制类型转换的最大好处就是: 制止编译器对你存心去做的事发出警告。 但是,利用强制类型转换说明使得编译器的类型检查机制失效,这不是明智的选择。 通常,是不提倡进展强制类型转换的。 除非不行幸免,如要调用malloc()函数时要用的void型指针转换成指定类型指针。 四、标准输入输出流 在C语言中,输入输出是运用语句scanf()和printf()来实现的,而C++中是运用类来实现的。 #includeiostream.h main()//C++中main()函数默认为int型,而C语言中默认为void型。 { inta; cout< cin>>a;/*输入一个数值*/ cout } cin,cout,endl对象,他们本身并不是C++语言的组成局部。 虽然他们已经是ANSI标准C++中被定义,但是他们不是语言的内在组成局部。 在C++中不供应内在的输入输出运算符,这和其他语言是不同的。 输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。 在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的全部说明都被编译器认为是注释,这种注释不能换行。 C++中仍旧保存了传统C语言的注释风格/*……*/。 C++也可采纳格式化输出的方法: #includeiostream.h intmain() { inta; cout< cin>>a; cout 类的设计、构造函数和析构函数 一、类的设计 1.类的声明 class类名 { private: //私有 ... public: //公有 ... }; 2.类的成员 一般在C++类中,全部定义的变量和函数都是类的成员。 假如是变量,我们就叫它数据成员假如是函数,我们就叫它成员函数。 3.类成员的可见性 private和public访问限制符确定了成员的可见性。 由一个访问限制符设定的可访问状态将始终持续到下一个访问限制符出现,或者类声明的完毕。 私有成员仅能被同一个类中的成员函数访问,公有成员既可以被同一类中的成员函数访问,也可以被其他已经实例化的类中函数访问。 当然,这也有例外的状况,这是以后要探讨的友元函数。 类中默认的数据类型是private,构造中的默认类型是public。 一般状况下,变量都作为私有成员出现,函数都作为公有成员出现。 类中还有一种访问限制符protected,叫爱护成员,以后再说明。 4.初始化 在声明一个类的对象时,可以用圆括号()包含一个初始化表。 看下面一个例子: #includeiostream.h classBox { private: intheight,width,depth;//3个私有数据成员 public: Box(int,int,int); ~Box(); intvolume();//成员函数 }; Box: : Box(intht,intwd,intdp) { height=ht; width=wd; depth=dp; } Box: : ~Box() { //nothing } intBox: : volume() { returnheight*width*depth; } intmain() { Boxthisbox(3,4,5);//声明一个类对象并初始化 cout } 当一个类中没有private成员和protected成员时,也没有虚函数,并且不是从其他类中派生出来的,可以用{}来初始化。 (以后再讲解) 5.内联函数 内联函数和平凡函数的区分是: 内联函数是在编译过程中绽开的。 通常内联函数必需简短。 定义类的内联函数有两种方法: 一种和C语言一样,在定义函数时运用关键字inline。 如: inlineintBox: : volume() { returnheight*width*depth; } 还有一种方法就是干脆在类声明的内部定义函数体,而不是仅仅给出一个函数原型。 我们把上面的函数简化一下: #includeiostream.h classBox { private: intheight,width,depth; public: Box(intht,intwd,intdp) { height=ht; width=wd; depth=dp; } ~Box(); intvolume() { returnheight*width*depth; } }; intmain() { Boxthisbox(3,4,5);//声明一个类对象并初始化 cout } 这样,两个函数都默认为内联函数了。 二、构造函数 什么是构造函数? 通俗的讲,在类中,函数名和类名一样的函数称为构造函数。 上面的Box()函数就是构造函数。 C++允许同名函数,也就允许在一个类中有多个构造函数。 假如一个都没有,编译器将为该类产生一个默认的构造函数,这个构造函数可能会完成一些工作,也可能什么都不做。 肯定不能指定构造函数的类型,即使是void型都不行以。 事实上构造函数默认为void型。 当一个类的对象进入作用域时,系统会为其数据成员安排足够的内存,但是系统不必须将其初始化。 和内部数据类型对象一样,外部对象的数据成员总是初始化为0。 局部对象不会被初始化。 构造函数就是被用来进展初始化工作的。 当自动类型的类对象离开其作用域时,所站用的内存将释放回系统。 看上面的例子,构造函数Box()函数承受三个整型擦黑素,并把他们赋值给立方体对象的数据成员。 假如构造函数没有参数,那么声明对象时也不须要括号。 1.运用默认参数的构造函数 当在声明类对象时,假如没有指定参数,那么运用默认参数来初始化对象。 #includeiostream.h classBox { private: intheight,width,depth; public: Box(intht=2,intwd=3,intdp=4) { height=ht; width=wd; depth=dp; } ~Box(); intvolume() { returnheight*width*depth; } }; intmain() { Boxthisbox(3,4,5);//初始化 Boxdefaulbox;//运用默认参数 cout return0; } 2.默认构造函数 没有参数或者参数都是默认值的构造函数称为默认构造函数。 假如你不供应构造函数,编译器会自动产生一个公共的默认构造函数,这个构造函数什么都不做。 假如至少供应一个构造函数,那么编译器就不会产生默认构造函数。 3.重载构造函数 一个类中可以有多个构造函数。 这些构造函数必需具有不同的参数表。 在一个类中须要承受不同初始化值时,就须要编写多个构造函数,但有时候只须要一个不带初始值的空的Box对象。 #includeiostream.h classBox { private: intheight,width,depth; public: Box(){//nothing} Box(intht=2,intwd=3,intdp=4) { height=ht; width=wd; depth=dp; } ~Box(); intvolume() { returnheight*width*depth; } }; intmain() { Boxthisbox(3,4,5);//初始化 Boxotherbox; otherbox=thisbox; cout } 这两个构造函数一个没有初始化值,一个有。 当没有初始化值时,程序运用默认值,即2,3,4。 但是这样的程序是不好的。 它允许运用初始化过的和没有初始化过的Box对象,但它没有考虑当thisbox给otherbox赋值失败后,volume()该返回什么。 较好的方法是,没有参数表的构造函数也把默认值赋值给对象。 classBox { intheight,width,depth; public: Box() { height=0;width=0;depth=0; } Box(intht,intwd,intdp) { height=ht;width=wd;depth=dp; } intvolume() { returnheight*width*depth; } }; 这还不是最好的方法,更好的方法是运用默认参数,根本不须要不带参数的构造函数。 classBox { intheight,width,depth; public: Box(intht=0,intwd=0,intdp=0) { height=ht;width=wd;depth=dp; } intvolume() { returnheight*width*depth; } }; 三、析构函数 当一个类的对象离开作用域时,析构函数将被调用(系统自动调用)。 析构函数的名字和类名一样,不过要在前面加上~。 对一个类来说,只能允许一个析构函数,析构函数不能有参数,并且也没有返回值。 析构函数的作用是完成一个清理工作,如释放从堆中安排的内存。 我们也可以只给出析构函数的形式,而不给出起详细函数体,其效果是一样的,如上面的例子。 但在有些状况下,析构函数又是必需的。 如在类中从堆中安排了内存,那么必需在析构函数中释放。 C++的内部数据类型遵循隐式类型转换规那么。 假设某个表达市中运用了一个短整型变量,而编译器依据上下文认为这儿须要是的长整型,那么编译器就会依据类型转换规那么自动把它转换成长整型,这种隐式转换出此时此刻赋值、参数传递、返回值、初始化和表达式中。 我们也可以为类供应相应的转换规那么。 对一个类建立隐式转换规那么须要构造一个转换函数,该函数作为类的成员,可以把该类的对象和其他数据类型的对象进展相互转换。 声明白转换函数,就告知了编译器,当依据句法判定须要类型转换时,就调用函数。 有两种转换函数。 一种是转换构造函数;另一种是成员转换函数。 须要采纳哪种转换函数取决于转换的方向。 一、转换构造函数 当一个构造函数仅有一个参数,且该参数是不同于该类的一个数据类型,这样的构造函数就叫转换构造函数。 转换构造函数把别的数据类型的对象转换为该类的一个对象。 和其他构造函数一样,假如声明类的对象的初始化表同转换构造函数的参数表相匹配,该函数就会被调用。 当在须要运用该类的地方运用了别的数据类型,廉价器就会调用转换构造函数进展转换。 #includeiostream.h #includetime.h #includestdio.h classDate { intmo,da,yr; public: Date(time_t); voiddisplay(); }; voidDate: : display() { charyear[5]; if(yr<10) sprintf(year,0%d,yr); else sprintf(year,%d,yr); cout<} Date: : Date(time_tnow) { tm*tim=localtime(&now); da=tim->tm_mday; mo=tim->tm_mon+1; yr=tim->tm_year; if(yr>=100)yr-=100; } intmain() { time_tnow=time(0); Datedt(now); dt.display(); return0; } 本程序先调用time()函数来获得当前时间,并把它赋给time_t对象;然后程序通过调用Date类的转换构造函数来创立一个Date对象,该对象由time_t对象转换而来。 time_t对象先传递给localtime()函数,然后返回一个指向tm构造(time.h文件中声明)的指针,然后构造函数把构造中的日月年的数值拷贝给Date对象的数据成员,这就完成了从time_t对象到Date对象的转换。 二、成员转换函数 成员转换函数把该类的对象转换为其他数据类型的对象。 在成员转换函数的声明中要用到关键字operator。 这样声明一个成员转换函数: operatoraaa(); 在这个例子中,aaa就是要转换成的数据类型的说明符。 这里的类型说明符可以是任何合法的C++类型,包括其他的类。 如下来定义成员转换函数; Classname: : operatoraaa() 类名标识符是声明白该函数的类的类型说明符。 上面定义的Date类并不能把该类的对象转换回time_t型变量,但可以把它转换成一个长整型值,计算从2000年1月1日到此时此刻的天数。 #includeiostream.h classDate { intmo,da,yr; public: Date(intm,intd,inty){mo=m;da=d;yr=y;} operatorint();//声明 }; Date: : operatorint()//定义 { staticintdys[]={31,28,31,30,31,30,31,31,30,31,30,31}; intdays=yr-2000; days*=365; days+=(yr-2000)/4; for(inti=0;idays+=dys[i]; days+=da; returndays; } intmain() { Datenow(12,24,2003); intsince=now; cout } 三、类的转换 上面两个例子都是C++类对象和内部数据对象之间的相互转换。 也可以定义转换函数来实现两个类对象之间的相互转换。 #includeiostream.h classCustomDate { public: intda,yr; CustomDate(intd=0,inty=0){da=d;yr=y;} voiddisplay() { cout<} }; classDate { intmo,da,yr; public: Date(intm=0,intd=0,inty=0){mo=m;da=d;yr=y;} Date(constCustomDate&);//转换构造函数 operatorCustomDate();//成员转换函数 voiddisplay() { cout<} }; staticintdys[]={31,28,31,30,31,30,31,31,30,31,30,31}; Date: : Date(constCustomDate&jd) { yr=jd.yr; da=jd.da; for(mo=0;mo<11;mo++) if(da>dys[mo])da-=dys[mo]; elsebreak; mo++; } Date: : operatorCustomDate() { CustomDatecd(0,yr); for(inti=0;icd.da+=da; returncd; } intmain() { Datedt(12,24,3); CustomDatecd; cd=dt;//调用成员转换函数 cd.display(); dt=cd;//调用转换构造函数 dt.display(); return0; } 这个例子中有两个类CustomDate和Date,CustomDate型日期包含年份和天数。 这个例子没有考虑闰年状况。 但是在实际构造一个类时,应当考虑到全部问题的可能性。 在Date里中具有两种转换函数,这样,当须要从Date型变为CustomDate型十,可以调用成员转换函数;反之可以调用转换构造函数。 不能既在Date类中定义成员转换函数,又在CustomDate类里定义转换构造函数。 那样编译器在进展转换时就不知道该调用哪一个函数,从而出错. 四、转换函数的调用 C++里调用转换函数有三种形式: 第一种是隐式转换,例如编译器须要一个Date对象,而程序供应的是CustomDate对象,编译器会自动调用适宜的转换函数。 另外两种都是须要在程序代码中明确给出的显式转换。 C++强制类型转换是一种,还有一种是显式调用转换构造函数和成员转换函数。 下面的程序给出了三中转换形式: #inclu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国计算机 二级 C+ 考试 复习 知识点 汇总
![提示](https://static.bdocx.com/images/bang_tan.gif)