第1章C+基础知识 ·23 cout<NO PARAMETER'<endl; 3: (5)在重载没有参数的构造函数和有默认参数的构造函数时,有可能产生二义性。 例如,下面定义的类special_class中就会产生二义性, class special_class int i public: special_class(); speciaL_class(int x=1); void main() /正确,使用cl:special_class(int构造函数 c2, /错误,无法精确调用构造函数 上面的程序中定义了两个重载函数special_class,.其中一个没有参数,另一个有一个 默认参数。如果在定义对象时不给出参数,则会产生二义性,因为编译系统无法确定应当 使用哪一个构造函数。在实际应用中,要注意避免这种情况。在类的定义中,还允许其他 类的对象作为它的数据成员,这种数据成员称为成员对象。 1.10.2析构函数 析构函数也是类中的特殊成员函数,与定义它的类具有相同的名字,但要在前面加上 一个波浪号(“”)。析构函数没有参数,也没有返回值,而且也不能重载,因此一个类中 只能有一个析构函数 析构函数执行与构造函数相反的操作,通常用于释放分配给对象的存储空间。当程 序超出类对象的作用域时,或者当对一个类指针使用运算符delete时,系统将自动调用析 构函数。 和构造函数一样,如果在类的定义中不定义析构函数,编译系统将为之产生一个歌认 的析构函数,对于大多数类来说,默认的析构函数就能满足要求。如果在一个对象完成其 操作之前还需要做一些内部处理,则应定义析构函数。例如,下面定义的类My_class中 定义了该类的析构函数。 char *str; int MaxLen; www.TopSage.com
www.TopSage.com
·24· 第1篇Visual C+基础知识 人大网 public: pSage.com My_class (char /定义类My_class的构造函数 str-new char[MaxLen]: ·My-class() /构造类My-class的析构函数 cout"Here delete the strendl: delete strt void GetString(char) 上面的例子是析构函数和构造函数最常见的用法,即在构造函数中用运算符new为 字符串分配存储空间,最后在析构函数中用delete释放已分配的存储空间。析构函数也 可以在类定义的内部声明而在类定义的外部定义。例如,上面的析构函数My_class在类 定义的外部定义如下: My_class::~My_class ( delete str 1.11重载 重载是C+的一个重要特征,它包含函数重载和操作符重载 1.11.1函数重载 所谓函数重载是指同一个函数名可以对应着多个函数的实现。函数重载允许一个程 序内声明多个名称相同的函数,这些函数可以完成不同的功能,并可以带有不同的类型 不同数目的参数及返回值。使用函数重载可以减轻用户的记忆负担,并使程序的结构简 单、易懂。 函数重载要求编译器能够惟一地确定调用一个函数时应执行哪个函数代码,即采用 哪个函数的实现。确定函数实现时,要求从函数参数的个数和类型上来区分。也就是说, 函数重载时,要求函数的参数个数或参数类型不同。 例如,下面的程序中实现的是两个不同参数类型的重载。在类My_class中对方法 pls进行了重载,通过重载,使得在求两个数的和时不用再区分整数和浮点数之间的不 同之处,而只需直接调用类My_class的方法plus即可。 #include<iostream.h #include<math.h include<stdlib.h> www.TopSage.com
www.TopSage.com
第1章C+基础知识 ·25· class My_class public: int plus(intn double plus(double,double); int My class::plus(int x,int y) return x十yi double My_class::plus(double x,doubley) return x-y: void main() My class Data coutThe result for plus(int,int)(5, coutThe result for plus(double,double)is:Data.plus(5.0,10.0)<endl; 对照上面的程序,可以看出,两个重载的成员函数分别调用求整型数之和及求浮点数 之和的函数plus来对不同的参数进行求和运算。 不仅在类的成员函数上可以实现重载,在构造函数上,也可以实现函数的重载 例如: elass sample int is public: sample(); //定义重载的构造函数 sample(int) sample::sample() /定义构造函数sample i=0: sample::sample(intx)/定义构造函数sample(imt) i=x www.TopSage.com
www.TopSage.com
·26· 第1篇Visual C+基础知识 定义重载的构造函数后,声明对象时就可以根据不同的参数来分别调用不同的构造 函数。例如: void main() sample A /自动阔用构造函数sample sample B(5); //自动用构造函数sample(int) 在处理不同类型的数据时,成员函数的重载使得类具有更大的灵活性和通用性,这也 有力地支持了通过类来对我们周围的客观世界进行抽象的程序设计的思想。 1.11.2操作符重载 操作符重载的能力增强了C+语言的可扩充性,对操作符的重载是将C+语言中已 有的操作符赋予新的功能,但与该操作符的本来含义不冲突,使用时只需根据操作符出现 的位置来判断其具体执行哪一种运算。 C+中单目运算、双目运算、物理内存管理运算符new和delete以及指针、引用等运 算操作均可以重载,但要注意的是,由于单目运算操作只能有一个参数,因此重载十十和 一一运算操作时,不可能区分是前置操作还是后置操作。 使用操作符重载时,必须用以下的方式来声明成员函数; 函数类型operator#(形参表) 其中,operator是关键字,#表示欲重载的操作符,函数类型指明返回值类型,通常与 类类型一致或为void型,以下是一个“操作符++”重载的例子。C+中约定,在增量运 算操作符中,放上一个整数形参,就是后置运算符。 #include <iostream.h class OperClass /声明一个类 int x public: OperClass(): /构造函数 OperClass operator++( //声明重载的操作符++,返回值类型为OperClass类 /这里的 ++为前登运算 OperClass operator++(int); /声明重的操作符++,返回值类型为OperC1a5s类 /这里的参数int表示此+十为后置运算 void display( //成员函数 OperClass:OperClass() /定义构造函数 www.TopSage.com
www.TopSage.com
第1章C+基础知识 x=0 lopSage.com void OperClass::display() /定义成员函数 cout《"x="《x《endl: OperClass OperClass:operator+-+(OI/定义重载前置操作符+十的具体操作 OperClass A: x十十; 1/进行正常的整数加1操作 A.x=x1 OperClass OperClass:operator+-+(imt)/定义重载后置操作符++的具体操作 OperClass A: 1/进行正常的整数加1操作 A.x=X1 return A: void main() OperClass X,Y; /声明两个对象 X.display( /对象X调用成员函数display() ++X: /对象X调用前置操作符+十 Y=++X: /对象X调用前置操作符十十,并将返回值赋给对象Y 上例中介绍的是单目操作符重载,因此有前置运算和后置运算之分,若使用双目操作 符重载,则没有这个问题,例如将上例作修改如下: class OperClass int x; public: OperClass(); OperClass Operator+(OperClass): /声明重载的操作符+,具有两个OperC1ass类类型的操作数 /返回值也是OperClass类类型 www.TopSage.com
www.TopSage.com