定义类
C++语言——面对对象的程序设计思想
抽象:
对具体对象(问题)进行概况,抽出这一类对象的公共性质加以描述的过程
(1)数据抽象
(2)行为抽象
封装:
将抽象出的数据成员,行为成员想组合,将他们视为一个整体——类
使用者不需要了解具体的实现细节只需要通过接口使用类的成员即可
继承与派生:
保持原有类特性的基础上,进行更具体的说明
类(class)是用户自定义数据类型。如果程序中要使用类型,必须根据实际需要定义,或者使用好自己设计好的类
C++定义一个类,其方法与定义一个结构体类型是相似的,一般形式为:
class 类名 { //类体成员列表};其中成员列表(member list)是类成员的集合,数目可以任意多,由具体应用确定。
一对大括号{ }是成员列表边界符,与成员列表一起称为类体(class body)
类体后面必须用分号( ; )结束
每个类可以没有成员,也可以有多个成员
类成员可以是数据或函数
所有成员必须在类的内部声明,一旦类定义完成后,就没有其它方式可以再增加成员了
类定义时必须给出各个数据成员(data member)的数据类型声明,其一般形式:
class 类名 { //类体...数据成员类型 数据成员名列表; //数据成员声明...};声明时成员列表允许为多个,用逗号( , )作为间隔,最后必须用分号( ; )结束
每个类还可以包含成员函数,能够访问类自身的所有成员
面对对象程序设计一般将数据隐蔽起来,外部不能直接访问,而把成员函数作为对外界的接口,通过成员函数访问数据。即数据成员是属性,成员函数是方法,通过方法存储属性
如果类中有成员函数,则声明成员函数是必需的,而定义成员函数则是可选的,因此类的成员函数有两种形式:
(1)在类中定义(也是声明)成员函数,形式如下:
class 类名 { //类体...返回类型 函数名(形式参数列表) //成员函数定义{函数体}...};(2)成员函数是声明在类中,定义在类外部,形式:
class 类名 { //类体...返回类型 函数名(类型1 参数名1,类型2 参数名2,...);// 成员函数声明返回类型 函数名(类型1,类型2,...)...};返回类型 类名::函数名(形式参数列表){//成员函数定义在类外部实现函数体}例:
class Data{ //Data类定义void set(int d);//成员函数原型声明,与void set(int);等价int get( ) { //成员函数类内部定义return data;} //get函数定义结束int data; //数据成员}; //Data类定义结束void Data::set(int d) //成员函数类外部定义{data = d; //访问类的数据成员}类定义一般放在程序文件开头,或者放到文件中被程序文件包含,此时这个定义是全局的。在全局作用域内,该定义处处可见,因此,同作用域内所有函数都可以使用它
类定义也可以放到函数内部或局部作用域中,此时这个定义是局部的。若是在函数内部有同名的类定义,则全局声明在该函数内部是无效的,有效的是局部定义
例:
class Data { //全局的Data类定义void show( ); //成员函数原型声明int data; //数据成员}; //Data类定义结束void fun( ) { //全局Data在fun函数中无效,有效的是局部定义的Dataclass Data { //局部的Data类定义void show( ) {cout<<data<<endl;}int data;}; //Data类定义结束}C++规定,在局部作用域中声明的类,成员函数必须是函数定义形式,不能是原型声明。一般地由于类是为整个程序服务的,因此,很少有将类放到局部作用域中去定义
类定义向编译器声明了一种新的数据类型,该数据类型有不同类型的数据成员和成员函数。因此,尽管数据成员类似变量的定义,但类型声明时并不会产生该成员的实体,即为它分配空间
对类的成员进行访问,来自两个访问源:类成员和类用户
类成员指类本身的成员函数,类用户指类外部的使用者,包括全局函数,另一个类的成员函数
无论是数据成员还是函数成员,类的每个成员都有访问控制属性,由以下三种访问标号说明:
public(公有的),private(私有的)和protected(保护的)
公有成员用public标号声明,类成员和类用户都可以访问公有成员,任何一个来自类外部的类用户都必须通过公有成员来访问。显然,public实现了类的外部接口
私有成员用private标号声明,只有类成员可以访问私有成员,类用户的访问是不允许的。显然,private实现了私有成员的隐蔽
保护成员用protected标号声明,在不考虑继承的情况下,protected的性质和private的性质一致,但保护成员可以被派生类的类成员访问
成员访问控制是C++的类和结构体又一重要的特性,加上访问标号,类定义更一般的形式为:
class 类名 { //类体public: //公有访问权限公有的数据成员和成员函数protected: //保护访问权限保护的数据成员和成员函数private:私有的数据成员和成员函数};如果没有声明访问控制熟悉,类所有成员默认为private,即私用的
class Data {int a,b; // 默认为私有的,外部不能直接访问public: //公有的,外部可以直接访问void set(int i,int j,int k,int l,int m.int n){ a=i,b=j,c=k,d=l,e=m,f=n;}protected: //保护的,外部不能直接访问,派生类可以访问int c,d;private: //私有的,外部不能直接访问,派生类也不可以访问int e,f;};说明:
(1)在定义类时,声明为public,private或protected的成员次序任意
(2)在一个类体中不一定都含有public,private,protected部分,可以只有public,private,protected部分或任意组合
(3)关键字public,private,protected可以分别多次出现,但更通过的做法是将相同访问控制属性的成员集中在一起写
(4)实际编程中,为了使程序清晰,每一种成员访问限定符在类体中只出现一次