全国计算机等级考试辅导讲义(C++部分)(6)

2019-08-26 17:29

佳恒计算机教育培训中心

①在函数内部定义的局部变量即为自动变量,用于说明自动变量的关键字auto可以省略。

②在函数头部定义的自动变量作用域为定义它的函数;而在块语句中定义的自动变量作用域为所在块。与C不同,C++还允许在变量使用之前才定义变量。

③编译程序不给自动变量赋予隐含的初值,故其初值不确定。因此,每次使用自动变量前,必须明确地赋初值。 ④形参可以看成是函数的自动变量,作用域仅限于相应函数内。

⑤自动变量所使用的存储空间由程序自动地创建和释放。当函数调用时为自动变量创建存储空间,函数调用结束时将自动释放为其创建的存储空间。因此,自动变量随函数的调用而存在并随函数调用结束而消失,由一次调用到下一次调用之间不保存值。 (2)外部变量

①在函数外部定义的变量即为外部变量。 ②外部变量的作用域是整个程序(全局变量)。

③在C++中,程序可以分别放在几个源文件上,每个文件可作为一个编译单位分别编译。外部变量只需在某个文件上定义一次,其他文件若要引用此变量时,应用extern加以说明。(外部变量定义时不必加extern关键字)。 ④在同一文件中,若前面的函数要引用在其后面定义的外部(在函数之外)变量时,也应用extern加以说明。 ⑤外部变量是由编译程序在编译时给其分配空间,属于静态分配变量,对于数值型(整型、浮点型和字符型)外部变量来说,其有隐含初值0。

引进外部变量的原因:其一是只要程序运行外部变量的值是始终存在的;其二是外部变量可以在所有函数间共享。 在C++中,可以使用外部变量,但是,必须要清楚使用外部变量的副作用。使用外部变量的函数独立性差,通常不能被移植到其他程序中,而且,如果多个函数都使用到某个外部变量,一旦出现问题,就很难发现问题是由哪个函数引起的。在C++中,尽量不用或少用外部变量,可使用参数在函数间进行数据的传递。 (3)静态变量 内部静态变量:

①在局部变量前加上\关键字就成为内部静态变量。

②内部静态变量仍是局部变量,其作用域仍在定义它的函数内。但该类型变量采用静态存储分配,当函数执行完,返回调用点时,该变量并不撤消,其值将继续保留,若下次再进入该函数时,其值仍然存在。内部静态变量有隐含初值0,并且只在编译时初始化一次。 外部静态变量:

①在函数外部定义的变量前加上\关键字便成了外部静态变量。

②外部静态变量的作用域为定义它的文件,即成为该文件的\私有\变量,只有其所在文件上的函数可以访问该外部静态变量,而其他文件上的函数一律不得直接访问该变量,除非通过外部静态变量所在文件上的各种函数来对它进行操作,这也是一种实现数据隐藏的方式。

③与内部静态变量一样,外部静态变量也采用静态存储分配,有隐含初值0。

在C++中,除了支持C风格的内部和外部静态变量的使用之外,还可将类成员声明成static,它有着不同的含义。 (4)寄存器变量

①只有自动(局部)变量和函数参数可指定为寄存器存储类,它的作用域与生存期与自动变量完全相同。 ②当指定的寄存器变量个数超过系统所能提供的寄存器数量时,多出的寄存器变量将视同自动变量。 ③只限于int,char,short,unsigned和指针类型可使用register存储类。 ④不能对寄存器变量取地址(即&操作)。

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

⑤使用寄存器变量可以提高存取速度,可将使用频率最高的变量说明成为寄存器变量。一般常用于说明循环变量。由于硬件的快速发展,存储器(如内存)的性能有了很大的改进,因此,目前在实际应用中,使用register来说明变量的情况并不多。 2.生存周期

(1)变量由编译程序在编译时给其分配存储空间(称为静态存储分配),并在程序执行过程中始终存在,这类变量包括全局变量、外部静态变量和内部静态变量。这类变量的生存周期与程序的运行周期相同,当程序运行时,该变量的生存周期随即存在,程序运行结束,变量的生存周期随即终止。

(2)变量由程序在运行时自动给其分配存储空间(称为自动存储分配),这类变量为函数(或块)中定义的自动变量。它们在程序执行到该函数(或块)时被创建,在函数(或块)执行结束时释放所用的空间。

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

第6章 类和对象

【考点一】 类的定义 1.类的定义

类的定义可以分为两部分:说明部分和实现部分。说明部分说明类中包含的数据成员和成员函数,实现部分是对成员函数的定义。

类定义的一般格式如下: //类的说明部分 class<类名>

{public:<成员函数或数据成员的说明>//公有成员,外部接口 protected:<数据成员或成员函数的说明>//保护成员 private:<数据成员或成员函数的说明>//私有成员 };

//类的实现部分

<各个成员函数的实现>

其中,class是声明类的关键字;<类名>是要声明的类的名字,必须符合标识符定义规则;花括号表示类的声明范围,说明该类的成员,其后的分号表示类声明结束。类的成员包括数据成员和成员函数,分别描述类所表达的问题的属性和行为。

关键字public、private和protected称为访问权限修饰符,它们限制了类成员的访问控制范围。各个成员函数的实现即可以在类体内定义,也可以在类体外定义。如果一个成员函数在类体内进行了定义,它将不出现在类的实现部分;如果所有的成员函数都在类体内进行了定义,则可以省略类的实现部分。在类体内定义的成员函数都是内联函数。 2.类成员的访问控制

类中提供了3种访问控制权限:公有(public)、私有(private)和保护(protected)。其中,公有类型定义了类的外部接口,任何一个外部的访问都必须通过外部接口进行;私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的;保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。 3.类的数据成员

类中的数据成员描述类所表达的问题的属性。

数据成员在类体中进行定义,其定义方式与一般变量相同,但对数据成员的访问要受到访问权限修饰符的控制。在定义类的数据成员时,要注意以下几个问题。

(1)类中的数据成员可以是任意类型,包括整型、浮点型、字符型、数组、指针和引用等,也可以是对象。但是要注意,只有另外一个类的对象,才可以作为该类的成员,即作为该类的成员对象而存在。自身类的对象是不可以作为自身类的成员存在的,但自身类的指针可以。

(2)在类体中不允许对所定义的数据成员进行初始化。 4.类的成员函数

类的成员函数描述类所表达的问题的行为。

类中所有的成员函数都必须在类体内进行说明。但成员函数的定义既可以在类体内给出,也可以在类体外给出。第一种方式是将成员函数直接定义在类的内部。第二种方式是在类声明中给出对成员函数的说明,而在类外部对成员函数进行定义(但成员函数仍然在类范围内)。这种在类外部定义的成员函数的一般格式是:<返回类型><类名>::<成员函数名>(<参数表>){<函数体>}

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

在类体外定义成员函数时,要注意必须在成员函数名前加上类名和作用域运算符(::)。作用域运算符用来标识某个成员属于某个类。

作用域运算符的使用格式如下:<类名>::<成员函数名>(<参数表>)或<类名>::<数据成员名>

成员函数的两种定义方式之间是有差别的。如果一个成员函数的声明和定义都在类体内,那么这个成员函数就是内联函数。如果一个成员函数的声明在类体内,而定义在类体外,这时对该成员函数的调用是按一般函数进行的。如果要将定义在类体外的成员函数也作为内联函数处理,就必须在成员函数的声明或定义两者之一前加上关键字\,以此显式地说明该成员函数也是一个内联函数。成员函数除了可以定义为内联函数以外,也可以进行重载,可以对其参数设置默认值。 【考点二】 对象的定义 1.对象的定义

对象是类的实例,一个对象必须属于一个已知的类。因此在定义对象之前,必须先定义该对象所属的类。

对象的定义格式如下:<类名><对象名>(<参数表>);其中,<类名>是待定义的对象所属的类的名字。<对象名>中可以有一个或多个对象名,多个对象名之间用逗号分隔。<对象名>中,可以是一般的对象名,也可以是指向对象的指针名或引用名,还可以是对象数组名。<参数表>是初始化对象时需要的,建立对象时可以根据给定的参数调用相应的构造函数对对象进行初始化。无参数时表示调用类的缺省构造函数。 2.对象的成员

一个对象的成员就是该对象的类所定义的成员,包括数据成员和成员函数。定义了对象后,可以使用\.\运算符和\运算符访问对象的成员。其中,\.\运算符适用于一般对象和引用对象,而\运算符适用于指针对象(即指向对象的指针)。访问对象成员的一般格式如下:

<对象名>.<数据成员名>或<对象名> -><数据成员名> <对象名>.<成员函数名>(<参数表>)或<对象名> -><成员函数名>(<参数表>) 【考点三】 构造函数和析构函数 1.构造函数和析构函数的定义。

构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一种特定的状态,使该对象具有区别于其他对象的特征。构造函数在对象被创建的时候由系统自动调用。构造函数也是类的成员函数,但它是一种特殊的成员函数,它除了具有一般成员函数的特性之外,还具有一些特殊的性质: (1)构造函数的名字必须与类名相同;

(2)构造函数不指定返回类型,它隐含有返回值,由系统内部使用; (3)构造函数可以有一个或多个参数,因此构造函数可以重载; (4)在创建对象时,系统会自动调用构造函数。 2.缺省构造函数和缺省析构函数

缺省构造函数就是调用时不必提供参数的构造函数。缺省的构造函数的函数名与类名相同,它的参数表或者为空,或者它的所有参数都具有默认值。前面日期类Date的定义中,构造函数Date(int y=2000);就是缺省构造函数。如果类中定义了一个缺省构造函数,则使用该函数;如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的公有缺省构造函数,它的定义格式如下: <类名>::<类名>(){}

每个类都必须有一个析构函数。如果一个类没有声明析构函数,编译器将生成一个公有的析构函数,即缺省析构函数,它的定义格式如下:

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)

佳恒计算机教育培训中心

<类名>::~<类名>(){} 拷贝构造函数

类中有一种特殊的构造函数叫做拷贝构造函数,它用一个已知的对象初始化一个正在创建的同类对象。拷贝构造函数的一般格式如下:

<类名>::<类名>(const<类名> &<引用对象名>){//拷贝构造函数体} 拷贝构造函数具有以下特点:

(1)也是一种构造函数,因此函数名与类名相同,并且不能指定函数返回类型。 (2)只有一个参数,是对同类的某个对象的引用。

(3)每一个类中都必须有一个拷贝构造函数。如果类中没有声明拷贝构造函数,编译器会自动生成一个具有上述形式的公有的拷贝构造函数。 【考点四】 对象的生存期 1.全局对象、静态对象与局部对象

对象的生存期是指对象从被创建开始到被释放为止的时间。对象按生存期可分为3类: (1)局部对象:当程序执行到局部对象的定义之处时,调用构造函数创建该对象;当程序退出定义该对象所在的函数体或程序块时,调用析构函数释放该对象。

(2)静态对象:当程序第一次执行到静态对象的定义之处时,调用构造函数创建该对象;当程序结束时调用析构函数释放该对象。

(3)全局对象:当程序开始执行时,调用构造函数创建该对象;当程序结束时调用析构函数释放该对象。 2.自由存储对象

动态内存分配技术可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后进行释放。这种在程序运行过程中根据需要可以随时建立或删除的对象称为自由存储对象。建立和删除工作分别由堆运算符new和delete完成。 【考点五】 this指针

C++提供了一个特殊的对象指针--this指针,它是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存取数据成员时,则隐含使用this指针。 【考点六】 静态成员

对于类中的非静态数据成员,每一个类对象都拥有一个拷贝(副本),即每个对象的同名数据成员可以分别存储不同的数值,这是保证每个对象拥有区别于其他对象的特征的需要。而类中的静态成员则是解决同一个类的不同对象之间的数据和函数共享问题的。静态成员的特性是不管这个类创建了多少个对象,它的静态成员都只有一个拷贝(副本),这个副本被所有属于这个类的对象共享。这种共享与全局变量或全局函数相比,既没有破坏数据隐藏的原则,又保证了安全性。静态成员表示整个类范围的信息,其声明以static关键字开始,包括静态数据成员和静态成员函数。 1.静态数据成员

静态数据成员声明时要使用关键字static。静态数据成员在每个类对象中并不占有存储空间,它只是在每个类中分配有存储空间,供所有对象公用。静态数据成员的值对每个对象都是一样的,但它的值可以被任何一个对象更新,从而实现了同一类的不同对象之间的数据共享。静态数据成员具有静态生存期,必须对它进行初始化。 静态数据成员初始化的一般格式如下:<数据类型><类名>::<静态数据成员名>=<初始值>; 在对静态数据成员初始化时应注意:

主讲教师:刘老师 咨询辅导答疑:QQ(30724125)


全国计算机等级考试辅导讲义(C++部分)(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2010年国家公务员考试行测真题

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

马上注册会员

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