·18 第1篇Visual C+基础知订 人大网 class类名:基类名 opSage.com 私有成员数据及函数: protected: 保护成员数据及函数: public 公共成员数据及面数 [类的对象声明]: 从上面的定义可以看到,一个类含有私有成员(private)、保护成员(protected)和公共 成员(public)三部分。默认时在类中定义的项都是私有的。私有部分的数据和函数只能 被该类本身声明的函数存取;保护部分的成员除可以被本类中的成员函数访问外,还可以 被本类派生的类的成员函数访问,因此用于类的继承:公共部分的成员可以被本类以外的 函数访问,是类与外部的接口。 类是面向对象程序设计最基本的单元,在设计面向对象程序时,首先要以类的方式指 述实际待解决的问题,也就是将问题所要处理的数据定义成类的私有或公共类型的数据, 同时将处理问题的方法定义成类的私有或公有的成员函数。 类也可以嵌套声明,例如: class My_student class boy /嵌人类boy,作为类My_student的成员之一 char boy_name[20] int boy_age; )my boy student: class girl /嵌入类gil,作为类My_student的成员之 char girl_name[20] int girl age: )my girlstudent: voidstudent_input(vod void studentoutput(void) 在上面的例子中,类My_student的定义中嵌套了类boy和girl。 1.9.2对象 在C+中,对象是声明为类类型的一个数据项,是类的实际变量。程序员也可以定 义类的变量。这个定义的类的变量在C+中就被称为对象。对象有时也称为类的实例 www.TopSage.com
www.TopSage.com
第1章C+基赠知识 ·19· (instance)。由此可见,类是程序中的一个静态的概念,而对象是程序中的一个动态的 概念 在C++中右两种方法可以定义举的对象: 第一种是在定义类的同时直接定义类的对象,即在定义类的右大括号“)”后直接写出 属于该类的对象名表列。如: 成员变量表列: 成员函数表列; }对象名表列; 还有一种是在定义好类后,再定义类的对象,其一般格式如下: 类名对象1[,对象2,.]: 在C+中通常也把类的成员函数称为类的方法。成员函数的原型一般在类的定义 中声明,在类的定义中声明其成员函数的语法与声明普通的函数所用的语法完全相同。 方法的具体实现既可以在类的定义内部完成(这种方式定义的类的方法有时也称为类的 内联函数),也可以在类的定义之外进行,而且方法的具体实现既可以和类的定义放在同 一个源文件中,也可以放在不同的源文件中 类的方法的具体实现和普通函数的具体实现只是在函数的头部有略微不同的格式。 一般来说,如果类的方法的定义是在类的外部实现的,则在定义方法时必须把类名放在方 法名之前,中间用作用域运算符(“:”)隔开,其一般形式如下所示: 类名:方法名 这样,即使几个类中的方法名相同,也可以用这种形式把它们区分开来。和普通函数 一样,类的方法应该有返回值类型,也有参数表列(当然也可以没有参数)。一个方法的头 部各部分如下所示 访问控制:函数返回值函数名(参数表列): 下面的一段程序实现在程序中定义一个名为angle的类 #include<iostream.h #include<math,h> const double ANG_TO_RAD=0.0174532925; /定义弧度和度之间的转换比例 class angle /定义类angle double value: /类angle的私有成员变量 /类angle的公共成员函数 void SetValue(double) double GetSine(void); }deg: /声明类angle的对象deg www.TopSage.com
www.TopSage.com
·20 第1篇Visual C+基础知识 void angle::SetValue(double a) /类angle的成员函数SetValue value=a double angle::GetSine(void) //类angle的成员函数GetSine double temp temp=sin(ANG_TO_RAD value) return temp: void main() deg.SetValue(60.0) /给类angle的成员变量value赋值 cout The sine of the angle is:" cout《deg,GetSine()《endl, 1/输出正弦值 这个程序的输出结果是: The sine of the angle is:0.866025 1.9.3内联方法 类的方法也可以声明和定义成内联函数。内联函数是指那些定义在类体内的成员函 数,即该函数的函数体放在类体内。内联函数在调用时不像一般的函数那样要转去执行 被调用函数的函数体,执行完成后再转回调用函数中并执行其后语句,而是在调用函数处 用内联函数体的代码来替换,这样将会提高运行速度。因此内联函数主要是解决程序的 运行效率问题,值得注意的是,内联函数一定要在调用之前定义,并且内联函数无法递归 调用。在C+中可以使用下面两种格式定义类的内联函数: (1)当在函数的外部定义时,把关键字inline加在函数定义之前。例如,下面的程序 段中定义的类angle的Set Value方法被定义成内联函数。 /定义类angle private: double value: void SetValue(double) inline void angle::SetValue(double x) //定义内联函数 value=x www.TopSage.com
www.TopSage.com
第1章C+基础知识 (2)把函数原型声明和方法的定义合并,放人类定义中。例如,下面的程序段在声明 类angle的Set Value方法后,紧接着就定义该方法的具体实现。 /定义类angle private: doublevalue 1/定义私有数据成员 public: void SetValue(double x)/定义内联函数 value=x 1.10构造函数和析构函数 C+中有几类特殊的成员函数,这些函数决定了如何建立、初始化、复制及删除对象 构造函数(constructor)和析构函数(destructor)是其中最重要的两种。和一般的成员函 数一样,构造函数和析构函数既可以在类的内部声明和定义:也可以在类的内部声明,在 类的外部定义。如果一个类含有构造函数,则在建立该类的对象时就要调用它;而如果一 个类含有析构函数,则在销毁该类的对象时调用它。 1.10.1构造函数 构造函数是一种特殊的成员函数,它主要用来为对象分配内存空间,对类的数据成员 进行初始化并执行对象的其他内部管理操作。构造函数的特点是构造函数的名字和它所 在的类名相同,当定义该类的对象时,构造函数完成对此对象的初始化。它可以接收参数 并允许重载。当一个类含有多个构造函数时,编译程序为了确定调用哪一个构造函数,需 要把对象中使用的参数和构造函数的参数表进行比较,这个过程与在普通的函数重载中 进行选择的过程是一样的。 下面的程序中定义了一个包含构造函数的类。 class student private: int Num: float Scoret public, student(int No,float s) /类student的构造函数,与类名student一致 Num=No: www.TopSage.com
www.TopSage.com
·22· 第1篇Visual C+基础知识 Score=s: } 上面定义的类名为student,其构造函数名也为student,该函数用来给对象赋初值。 构造函数是在定义对象的同时调用的,其一般形式为: 类名对象名(实参表): 关于构造函数还必须说明以下几点: (1)构造函数和普通函数一样也可以有参数,但不能有返回值。这是因为构造函数 通常是在定义一个新的对象时调用,它无法检查构造函数的返回值。 (2)在实际应用中,如果没有给类定义构造函数,则编译系统将为该类生成一个歌认 的构造函数,该默认的构造函数没有参数,只是简单地把对象中的每个实例变量初始化 为0 (3)构造函数可以有默认参数。例如,下面定义的类My_class中的构造函数带有一 个默认参数x=3.5,y=8.5。 class My_class float a,b My_class(float x-3.5,float y-8.5) /带有歌认参数的构造函数 a=xi b=yi : 构造函数My_class的两个参数均为默认参数,在定义对象时可以省略实参。因此, 可以用下面的语句来定义类My-class的对象, My_class cl(2,4); My class c2(4): My-class c3; (4)构造函数也可以没有参数。例如,下面定义的类My_class中的构造函数就没有 参数,该类的构造函数执行的功能是在屏幕上输出一句“NO PARAMETER”。 class My_class public: My_class() //没有参数的构造函数 www.TopSage.com
www.TopSage.com