定义类与成员的访问控制

(1)抽象:对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。

1.数据抽象

2.行为抽象

(2)封装:将抽象出的数据成员、行为成员相结合,将他们视为一个整体——类。使用者不需要了解具体的实现细节,只需要通过接口使用类的成员即可。

(3)继承与派生:保持原有类特性的基础上,进行更具体的说明。

类(class)是用户自定义数据类型。如果程序中要使用类类型 (class type),必须根据实际需要定义,或者使用已设计好的类。

C++定义一个类,其方法与定义一个结构体类型是相似的,一般形式为:

class 类名 {

//类体 成员列表

};

其中成员列表(member list)是类成员的集合,数目可以任意多, 由具体应用确定。一对大括号{}是成员列表边界符,与成员列表一起称为类体(class body)。类体后面必须用分号(;)结束

每个类可以没有成员,也可以有多个成员。

类成员可以是数据函数。  

所有成员必须在类的内部声明,一旦类定义完成后,就没有任何其他方式可以再增加成员了。

类成员是数据

类定义时必须给出各个数据成员(data member)的数据类型声明, 其一般形式为:

class 类名 { //类体

数据成员类型 数据成员名列表; //数据成员声明

… }; 

声明时成员名列表允许为多个,用逗号(,)作为间隔,最后必须 用分号(;)结束。

类成员是函数

每个类还可以包含成员函数,能够访问类自身的所有成员。

面向对象程序设计一般将数据隐蔽起来,外部不能直接访问,而把成员函数作为对外界的接口,通过成员函数访问数据。即数据成员是属性,成员函数是方法,通过方法存取属性。

如果类中有成员函数,则声明成员函数是必需的,而定义成员函数则是可选的,因此类的成员函数有两种形式。

 

 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函数中无效,有效的是局部定义的Data
 class Data { //局部的Data类定义
 void show() { cout<<data; }//set函数定义
 int data; //数据成员
 }; //Data类定义结束
}

C++规定,在局部作用域中声明的类,成员函数必须是函数定义形式,不能是原型声明。一般地,由于类是为整个程序服务的,因此很少有将类放到局部作用域中去定义。

类定义向编译器声明了一种新的数据类型,该数据类型有不同类型的数据成员和成员函数。因此尽管数据成员类似变量的定义,但类型声明时并不会产生该成员的实体,即为它分配存储空间

对类的成员进行访问,来自两个访问源:类成员类用户

类成员指类本身的成员函数,类用户指类外部的使用者,包括全局函数、另一个类的成员函数等。

无论数据成员还是函数成员,类的每个成员都有访问控制属性,由 以下三种访问标号说明:public(公有的)、private(私有的)和protected(保护的)。

公有成员用public标号声明,类成员和类用户都可以访问公有成员, 任何一个来自类外部的类用户都必须通过公有成员来访问。显然, public实现了类的外部接口

私有成员用private标号声明,只有类成员可以访问私有成员,类用 户的访问是不允许的。显然,private实现了私有成员的隐蔽

保护成员用protected标号声明,在不考虑继承的情况下, 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可以分别出现多次,即一个类体可以包含多个public、private或protected部分。但更通用的 做法是将相同访问控制属性的成员集中在一起来写。

(4)实际编程中,为了使程序清晰,每一种成员访问限定符在类体中只出现一次,且按照public、protected、private顺序组织,形成访问权限层次分明的结构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木(。・ω・。)ノ♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值