2011年春江苏省计算机二级VC++考试备考提纲(2)

2019-03-09 18:19

3> 指针与数组:(1)通过数组名引用一维数组元素:数组名代表数组首地址,即第一元素地址,它可作为指针来

使用;(2)通过指针引用一维数组元素:即将某个数组元素的地址赋给一个指针变量, 便可通过指针引用数组元素,如:数组a[3]={0,1,2},*p=a;*p=&a[1],都是正确的引用。 (3)二维数组与指针:一个二维数组可以看成一个以一维数组作为其每个元素的一维数组形式。注意:以下是几个容易混淆的概念:A:a是数组名,始终不变的指向二维数组的起始单元,对它增减1将越过二维数组的一行,是行地址,a+i表示第i行第0列元素的起始地址。 B:a[0]:相当于一个一维数组名,代表了该行的首地址(指向该行第0列这个内存单元),对其增减1将越过二维数组的一个元素,是元素地址。a[0]+1表示二维数组第0行第1列元素的地址,*(a[0]+1)表示的是元素。 C:a[0][0]:表示二维数组第0行第0列的元素。 (4)使用指针变量表示字符串与字符数组表示字符串的区别:A:定义格式不同:前者:char * str=”hello”; str是字符指针变量,存放的是字符串首地址,而不是整个字符串; 后者:char str[]=”hello”;其中字符数组是由若干个数组元素组成的,它存放了整个字符串。 B:赋值方式不同:前者可以对变量str赋值(因为字符指针变量本身是一个变量,其值可变,可通过赋值使其指向新的字符串。);后者只能对其各个元素赋值,不能对数组名赋值(数组名代表首地址,不可改变)。

4> 指针变量与结构体:1结构体指针变量:指向结构体变量的指针变量。2,指针变量也可以指向结构体数组。3,

要通过运算符—>引用结构体中的成员。 5> 指针变量与函数:(1)指针变量作为函数参数:此时传递给函数的是变量的地址,即地址传递。函数调用时,

实参将地址传递给形参,使得二者指向同一内存地址,函数体内形参指针对所指变量的改变将直接影响实参所指向的对象的值,从而达到了在函数体内修改函数体外的变量值的目的。(2)返回指针的函数:格式:数据类型 * 函数名(形参表)。函数返回指针的最主要目的就是在函数结束时,通过指针返回大量的所需要的数据。因为,返回指针实质上是返回了地址,通过这些地址我们可以得到其中存放的内容,从而返回了大量的数据。 (3)指向函数的指针变量:每个函数在内存中都占有一定的内存空间,也有一个起始地址称为函数的入口地址,若将函数的起始地址赋给指针变量,则可使指针变量指向该函数,可通过指针变量来调用此函数。具体步骤为:A:定义一个指向函数的指针变量,格式为:数据类型 (*指针变量名)(形参表),数据类型表明指针变量所指向的函数的返回值类型; B:将函数的入口地址赋给指针变量。注意:利用指针变量调用函数时,若不作强制类型转换,指向函数的指针变量只能指向与该指针变量具有相同返回值类型和相同参数的任一函数。 C:通过指针变量调用函数。

6> 指针数组:若干同类型指针所组成的数组。定义格式:数据类型 * 指针数组名[元素个数]。

7> 二级指针:指针变量作为一种变量,它也有内存地址,是二级地址。用于存放指针变量的地址的指针变量称为

二级指针,即指向指针的指针。定义格式:数据类型 **指针变量名;使用时应注意:不能将变量的地址赋值给二级指针(其容纳的是指针的地址)。

8> new与delete的应用:1,new运算符:用于动态分配内存。执行new操作时,若操作成功,返回的是内存地址,

可赋给一个指针;如果无内存分配,则返回空指针NULL,所以,在使用new分配内存时,应检查内存分配是否成功。 使用格式:A:指针变量=new 类型名(初值);如:char *p=new char(?a?); B:指针变量=new 类型名[元素个数];如:cin>>n;char *p=new char[n];系统根据运行时n的值动态的为数组分配内存,若分配成功,则p将指向数组的第一个元素。 2,delete运算符:用于释放由new操作符分配且不需再用的内存空间。使用格式:A:delete 指针变量;或delete []指针变量;前者用于释放指针所指向的变量所占用的内存,若指针指向的是一个数组,则使用后者。 应注意:释放一个已释放的内存可能导致程序崩溃,所以释放后最好将指针变量置为0 9> 引用:1,引用本质上是一个别名,它不占存储空间,而是与它所关联的变量或对象占用同一个内存空间,因此,

所有对引用的操作实际上就是对引用的目标对象操作。定义格式:类型 & 引用名=变量名;注意点:在定义引用变量时,必须对其进行初始化;不能有空引用,引用必须维系一定的目标对象,空引用是无意义的;不能建立引用数组;不能定义引用的指针,也没有引用的引用。 2,引用作为函数参数:这种参数传递的方式称为引用传递。因为引用与其所关联的变量或对象占用同一个内存空间,因此,当引用作为函数的形参时,函数体内对引用形参的修改实际上是对引用所关联的变量的修改,即实参要根据形参的改变而改变。 3,引用为函数的返回值:如:int &f(inta,intb) .注意规则:A不能返回局部变量的引用,因为局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。B不能返回函数内部new分配的内存引用。

10> 单向链表的处理:略。

第八章 类和对象

1> 类:类是C++语言中的一种数据类型,在类中即可包含数据,又可包含对数据进行操作的函数,类中成员包含

数据成员和成员函数两部分,从访问权限上可分为三类:public,protected,private。 注意:在定义时:1,关键

字出现的次数和次序可以是任意的;2,系统未对类分配内存空间,所以此时不能对其数据成员进行初始化;3,任何成员不能使用extern,auto,register。

2> 对象:是类的实例。对象的定义方法与定义结构体变量的方法类似:可以先定义类,后定义对象;也可以同时

定义,如:Local a,b;定义了类Local的两个对象a,b。 注意:通过运算符‘.’来访问对象的成员;同类的对象可直接赋值,如:b=a; 可以定义指向对象的指针; 对象也可以像其它变量一样作为数组的元素,函数的参数; 一个对象也可以作为其它类的成员使用。

3> 数据成员和成员函数:A:访问权限:1,public:允许被该类以外的函数访问; 2,protected:只能被该类成员函

数以及该类的派生类中成员函数访问;3private:只允许该类中的成员函数访问。 B:成员函数的重载:在类中说明2个或以上的函数的名字是相同但其参数类型或个数却不同的成员函数,编译器根据参数个数或类型的不同来判断调用哪一个函数。 C:this指针:

4> 类与结构体的异同:同:格式类同,结构体可以看成是类的一个特例; 异:类中成员的缺省访问权限是private,

而结构体中为public。

第九章 构造函数和析构函数

1> 对比表: 定义格式 作用 构造函数 析构函数 类名(形参表);类外:类名::类名(~) ~类名(){······} 为对象分配内存,对类的数据成员进行初在对象消失时执行一些清理任务 始化并执行对象的其它内部管理操作 参数 可以有 无 返回值 无 无 重载 能 不能 默认~函数 没有参数,函数体为空 函数体为空 调用 创建对象时,自动被调用 某个对象生存期结束时自动被调用 类的成员函数 是 是 特点 与类名相同 与类名相同,函数名前有一波浪线 对象类型 调用时间 全局对象 程序运行时 程序结束时 局部对象 对象定义处 离开程序块时 静态局部对象 第一次执行对象定义时 程序结束时 new创建的对象 创建对象处 Delete显示撤销时 注意点:1,构造函数与对象的初始化:A:当定义类的对象时(系统为对象分配内存),类的构造函数可以完成对此对象的初始化(系统将参数传递给构造函数,从而给对象的数据成员赋了初值)。 B:使用new来动态建立对象时(该对象不再使用时需用delete释放对象所占有的空间),系统也自动调用构造函数为对象进行初始化,最后返回此对象的起始地址。 2,构造函数与对象成员:在定义一个新类时,可把一个已定义类的对象作为类的成员,对这样的对象成员进行初始化必须通过在新类的构造函数中调用对象成员的构造函数来实现。对象成员的构造函数的调用顺序与它们在成员初始化列表的次序无关,而是取决于它们在类定义中的声明次序。 3,通常析构函数中的主要工作是使用运算符delete释放由new动态生成的对象和对象数组所占有的内存空间,new与delete必须配套使用。 4,类型转换构造函数: 5:拷贝构造函数:当创建一个对象时,用另一个同类的对象对其初始化,系统会自动调用其。定义格式:类名 (类名&对象名);构造函数的参数必须是同类对象的引用。两种调用情况:如A(A&a);A a;A b=a;或A a;A b(a)。 5:每个类均有构造函数(一个或多个),若用户不定义,编译器将自动产生一个默认构造函数,形式为:类名::类名()。其有三种使用情形:(1)用户没有定义构造函数;(2)用户定义的没有形参的构造函数;(3)用户定义的每个形参都有默认值的构造函数。 注意:每个类只能有一个默认构造函数。

第十章 继承和派生类

1> 概念:A:定义格式:class 派生类名:继承方式 基类名1,基类名2······{}; B:继承方式:其影响的是

派生类对基类的原有成员的访问权限,但无论采用何种继承方式,基类中的私有成员在派生类中是不可访问的。 因此继承方式实际影响的只是对基类中原有的公用成员和保护成员的访问权限。 所以:共有派生:~保持原有

2>

3>

4>

5>

6>

的访问权限; 保护派生:~都成为派生类的保护成员; 私有派生:~都作为派生类的私有成员。

初始化基类成员:构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,派生类的构造函数的格式:派生类名(形参表):基类名1(形参表1),:基类名2(形参表2)··· 注意:A:在创建派生类对象时,先调用基类的构造函数,(派生类定义对象时)再调用对象成员的构造函数,最后调用派生类的构造函数;撤销对象时,析构函数被调用的顺序则相反。 B:多重继承时,先调用哪一个基类的构造函数,由派生类定义时先继承哪一个决定。 C:当派生类中包含对象成员时,则派生类的构造初始化成员列表中既要列出基类的构造函数也要列出对象的构造函数。 D:当类中有多个对象成员时,调用对象成员所属类(比一定是基类)的构造函数的顺序由对象成员定义的先后顺序决定。 E:基类中有缺省函数时(有默认的构造函数或未定义构造函数时),派生类构造函数后的成员初始化列表中可省略对基类构造函数的定义。 冲突,支配规则和赋值兼容性:A:冲突:当多重继承时,不同基类中的成员常常有相同的名字,从而导致派生出的成员重名的现象。 解决方法:1,使基类成员名各不相同;2,将所有基类的数据成员设为私有成员;3,使用作用域运算符来说明成员是属于哪个类的(常用方法),格式:类名::成员名。 B:支配规则:C++中允许派生类新增加的成员名与其基类名成员名相同,当没有使用作用域运算符时,派生类的定义的成员名优先于基类中的成员名,此关系即为支配规则; C:赋值兼容性规则:是指在公有派生情况下,一个派生类的对象可以用在其基类对象可使用的地方(即将一个派生类对象赋给基类的对象,这个赋值是将派生类从基类中继承来的成员赋给基类对象相应的成员),具体规则为:1,派生类的对象可以向基类的对象赋值,反之则不允许;2,派生类的对象可以初始化基类的引用;3,派生类对象的地址可以赋给指向基类类型的指针。3,以上情况只能访问从相应基类中继承来的成员,而不能访问其它基类的成员或在派生类中增加的成员。 虚基类:为了使公共基类在它的派生类中只有一个拷贝(消除二义性),可将基类定义为虚基类。1,定义格式为:class 派生类名:virtual 继承方式 基类名{···};或:将virtual后移一格。 2,虚基类构造函数:(1)若一个派生类有一个直接或间接的虚基类,则每个派生类的构造函数的初始化成员列表中都必须列出对虚基类构造函数的调用,若未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类对象的成员;(2)在一个成员初始化列表中若同时出现对虚基类和非虚基类构造函数的调用,则应先调用虚基类的构造函数。 友元函数:当类的成员访问权限被定义为私有或保护时,在类外只能通过该类的成员函数来访问,为了提高程序的运行效率,引入友元函数。A:定义格式:friend 类型 函数名(形参){};B:友元成员函数:一个类的友元函数可以是一个不属于任何类的普通函数,也可以是另一个类的成员函数,此时友元函数称为~;C:友元类:当类A作为类B的友元时,即意味着类A中可使用类B的所有成员。 D:注意点:(1)友元函数不是类的成员函数,类的内外都可以定义友元函数;在类内定义时,并不表示它是该类的成员函数,它不属于任何类,在类外定义时,与普通函数定义一样,不应在函数名前加上类名;(2)友元函数可以访问类中的任何成员;(3)不可带this指针,所以可以用对象名,对象的应用和对象的地址作为友元函数的参数,在函数体中使用运算符“·”或“—>”来访问对象的成员;(4)在类中对友元函数指定的访问权限无效;(5)可以将普通函数,成员函数或者类作友元;(6)其调用不同于成员函数的调用,必须直接调用。

静态成员:A:静态数据成员:由关键字static修饰的数据成员。必须在类体内作引用性说明,同时在类体外对其作定义性说明(初始化格式:类型 类名::静态成员名=初始值;缺省初值为0。在类体外的使用格式:类名::静态成员名或对象名·静态成员名)。注意点:(1)在说明一个类的不同对象时,其成员之间是独立的,当我们将一个类的某些数据成员的存储类型指定为静态类型时,由该类所产生的所有对象均共享为静态成员分配的一个存储空间,在说明对象时,并不为静态类型的成员分配空间;(2)其初始化必须放在类外的全局范围内进行,不能在类的构造函数中对其初始化,因为构造函数将多次被调用,而静态数据成员只能初始化一次;静态数据成员是类的成员,而不是某个对象的成员,并且初始化时前面不加static,也不使用成员的访问权限控制符public等进行修饰。B:静态成员函数:类体内外均可定义,在类外时,不能用static修饰。在类外可通过:“类名::静态成员函数名(实参)或对象名·静态成员函数名(实参)”来调用使用其。 注意点:在静态成员函数的实现中,不能直接引用类中说明的非静态成员(可通过对象来引用),只能直接引用本类中说明的静态成员; 为了保持静态数据的一致性,通常在构造函数中不给静态数据成员置初值,而在静态数据的定义性说明时置初值。

第十一章 多态性

1> C++中,多态性可分为:编译时的多态性(或称静态多态性)和运行时的多态性(或称动态多态性)。编译时的

多态性是通过函数重载或运算符重载来实现的;运行时的多态性是通过继承和虚函数来实现的。若某类中的成员函数被说明为虚函数,则该函数在派生类中可以有不同的实现。

2> 虚函数:1定义格式:A:在类体中定义:virtual 返回类型 函数名(形参表){函数体}; B:在类体中原型说

明(virtual 类型 函数名(形参);),在类体外定义:类型 类名::函数名(形参){函数名}; 2,注意点:A:虚函数可以在一个或多个派生类中被重定义(基类的虚函数在派生类中一定要重新定义),此时必须与基类中的函数原型完全相同(包括函数名,返回类型,参数个数和类型的顺序),而且无论在派生类的相应成员函数前是否加上关键字virtual,都将视其为虚函数。若果与函数原型不同,只是函数名相同,将其视为一般的函数重载,而不是虚函数。 B:实现运行时的多态性,必须使用基类类型的指针变量或者对基类的引用使指针指向不同派生类的对象,并通过调用指针所指向的虚函数才能实现动态的多态性(即只有基类的指针才能指向基类的对象和派生类的对象,且以“指针—>虚函数”的方式调用)。若通过“对象·虚函数”的方式调用虽然也能得到同样的结果,但不是运行时的多态性。 C:虚函数只能是类的一个成员函数,不能是静态成员函数,更不能是友元函数。 D:虚函数与重载函数的区别(二者都是在程序中设置一组同名函数,都反映了面向对象程序的多态性):虚函数不仅同名,而且同原型,而函数重载并不是原型完全相同; 虚函数仅用于基类和派生类之中,而函数重载则不需要通过继承关系来体现。E:构造函数不能定义为虚函数,但析构函数可以。

3> 纯虚函数:定义格式:virtual 返回类型 函数名(形参表)=0。 注意点:A:函数名赋予0表示该函数无函数

体,并不表示赋值运算; B:定义纯虚函数时,不能定义函数的实现部分,它的实现留给其派生类去完成; C:由于纯虚函数没有函数体,是一个不完整的函数,含纯虚函数的类也是一个不完整的类,所以不能用含纯虚函数的类来说明对象; D:至少包含一个纯虚函数的类称为抽象类,它只能作为派生类的基类,不能声明抽象类的对象。抽象类的唯一用途就是为派生类提供基类;纯虚函数的作用是作为派生类中的成员函数的基础,并实现动态的多态性(其实现方法与一般的虚函数相似,所不同的是它要经过两次继承和派生)。

4> 运算符重载:就是对已有的运算符重新定义,按照用户规定的要求去完成特定的操作,其本质是通过函数重载

来实现的。 A:一般定义格式:类型 类名::operator@(形参表){···};其中:类型为运算符重载函数的返回值类型;类名为运算符重载函数所在的类名;operator为关键字;@代表被重载的运算符;形参表中参数的个数由运算符的目数及函数的类型来决定,函数的类型是指运算符重载函数可以是类的成员函数(定义格式:类型 operator 运算符(参数表){函数体}),也可以是类的友元函数(定义格式:friend~)。 B:使用成员函数重载运算符(运算符重载函数的参数个数为0个或1个)的方法:1:对于只有一目操作数的运算符,在重载这种运算符时,通常不能有参数;而对于有两目操作数的运算符,只能带一个参数,不允许重载三目操作数的运算符。 2:成员函数实现运算符的重载时运算符的左操作数一定是当前对象,右操作数作为调用运算符重载函数的参数,参数可以是对象,对象的引用,或其它类型的参数; 3:成员函数实现一元运算符重载的一般格式为:类型 类名::operator@(){···};其中@为被重载的一元运算符,成员函数的this指针所指向的对象作为运算符的操作数,但由于运算符++ ,——存在前置和后置的问题,在定义运算符重载时有所区别:++作前置运算时,运算符重载函数格式为:类型 类名::operator ++(){···};作后置运算时,格式为:类型 类名::operator ++(int a){···};此处参数仅作为与前置运算的区分,没有实际意义,所以变量名可有可无,——的重载函数的定义与此类同。 4:成员函数实现二元运算符重载的格式:类型 类名::operator @(参数表){···};其中,参数表中的参数只能有一个,运算符的左操作数一定是成员函数所在类的对象,成员函数的this指针指向此对象;运算符的右操作数作为函数的参数,它可以是对象,对象的引用或是其它类型的数据。 C:使用友元函数重载运算符的方法:由于友元函数不是类的成员函数,对于只有一目操作数的运算符,在重载这种运算符时,有一个参数;而对于有两目操作数的运算符,带有两个参数。 1:友元函数实现一元运算符重载的格式:friend 类型 operator @(X&x){···};其中,运算符重载函数是类X的友元,X为类名,x为类X的对象。++作前置运算符时,其运算符重载函数格式为:friend 类型 类名::operator ++(类名&){···};后置时:~(类名&,int a)~ ,此处参数仅作为与前置运算的区分,无实际意义,变量名可有可无,——的重载函数的定义与此类同。 2:友元函数实现二元运算符重载格式:friend 类型 operator @(参数1,参数2){···}; 3:通常我们将二元运算符重载为友元运算符,一元运算符重载为类运算符。 D:成员函数重载运算符和友元函数重载运算符的联系与区别:(1)在类外定义时,成员函数的类型后面一定要有类名和作用域运算符,而友元函数则不能有; (2)成员函数可以通过this指针传递当前对象,而友元函数没有this指针,所以重载同一个运算符时,友元函数通常比成员函数多一个对象类型的参数(可以是对象,对象的引用或类类型的指针)注:对象作参数是值传递,为了把操作结果带回主函数,应以对象的引用或类类型的指针作参数。 (3)在函数体中,成员函数可以直接使用类的成员,而友元函数一定要指明成员所属的对象,即使用方式为:对象·成员,(*指针)·成员或 指针—>成员 。(4)二者实现的功能是一样的,对象表达式也是相同的,但其含义是不同的,函数的调用形式也是不同的。 E:重载运算符时的注意事项:(1)运算符重载是改变已有运算符的操作数范围和操作内容,而不能创造新的运算符,也不能改变运算符的优先级,目数和结合性等基本性质;(2)不允许重载运算符: ·(成员操作符),*(成员指针操作符), ::(作用域运算符), ?:(三目运算符), #(编译预处理符号), sizeof()(求字节数运算符)。 只能用成员函数重载:=,[],(),—>。 只能用友元函数重载: << , >> 。


2011年春江苏省计算机二级VC++考试备考提纲(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018届高考总复习课标版生物练习:专题专练3-9-6植物的激素调节

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: