Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:36:13
C++封装与访问控制[二.二]

C/C++封装与访问控制[二.二]

C/C++封装与访问控制[二.二]

1.封装与访问控制的含义

封装是指对对象的属性与方法实施一定访问控制的技术,这里的访问通常指调用、查看、修改等操作。实施封装的好处是可以控制对象属性值和行为被无序访问,使得访问规范地通过事先周密规划和实现的权限控制和接口实现。C++实现OOP 的封装是通过对成员变量和成员函数的访问控制以及父类派生子类时的派生方式控制实现的,表2-1 给出了C++通过访问和派生控制实现的封装规则。

表 2-1 C++通过访问和派生控制实现的封装规则



关于表2-1 的说明:

(1) 第3 列的“类定义”是指在类定义与实现中对自身成员变量和成员函数的访问。

(2) 第4 列的“子类定义”是指在子类定义与实现中对父类成员变量和成员函数的访问。

(3) 第5 列的“类实例”是指在类实例中对自身成员变量和成员函数的访问。

(4) 第6 列的“子类实例”是指在子类实例中对父类成员变量和成员函数的访问。

(5) 为了便于理解和说明,给表中的控制规律单元格进行了编号,如2.2 表示在通过public方式派生的子类实例中,对父类的采用protected 控制的成员的访问控制规则:√表示允许访问,×表示不允许访问。

C++实现OOP 的封装通常遵守如下规律:

(1) 类的成员变量一般采用protected 或private 访问控制,必要时提供访问接口,参见【源程序2-2】的第7~8 行、第13~14 行。

(2) 类的成员函数一般采用public 访问控制,以便于继承和访问,但也有专供内部使用的通过private 或protected 控制的成员函数,参见【源程序2-2】的第29~43 行。

(3) 父类派生子类一般采用public 派生方式,使得子类可以继承和访问父类的多数成员,参见【源程序2-2】的第21 行、第46 行。

2.封装与访问控制的C++实现样板分析

【源程序 2-2】中通过派生控制和访问控制实现封装的实例分析:

(1) 表2-1 中的第3 列“类定义”全部为允许,其含义就是在类定义与实现编码中,可以自由地访问自己所定义和实现的任意成员变量和成员函数,不受访问控制符和派生方式的任何约束。例如,第83~84 行代码位置是属于Point 类成员函数的实现段,因此可以自由地对自身声明的成员变量PType 和NumOfInstances 进行操作(此处是查看和赋值)。

(2) 表2-1 中的第5 列“类实例”的访问控制是指在类实例中对自身定义和实现的成员变量和成员函数的访问控制规律。3.1×和3.2×表示类实例中不允许对自身定义和实现的private和protected 类型的成员进行直接访问,3.3√表示类实例中允许对自身定义和实现的public 类型的成员进行直接访问。例如,类Point 的定义中在第23~28 行分别声明了受public 控制的成员变量PType、受protected 控制的成员变量NumOfInstances 和受priavte 控制的成员变量Visible,因此对于第188 行生成的Point 类的P1,P2 等实例,参照表2-1 可分析下面的操作合法性:



Point P1(2, 9, Online), P2(2, 9), … //自动调用匹配的构造函数生成类实例

cout<
cout<
cout<
cout<
cout<
cout<
P1.AssignAPoint(P2); //根据表2-1 的 3.1,不允许


(3) 表2-1 中的第4 列“子类定义”的访问控制是指在子类定义和实现中对父类的成员变量和成员函数的访问控制规律。从第21 行的Point 类的声明中可以看出,Point 类是由Location类通过public 方式派生的子类,因此第21~45 行、第79~135 行的代码段都属于由父类Location 派生的子类Point 的定义与实现代码,这两个代码段对父类Location 的成员变量和成员函数的访问会受到相应的控制,2.1×表示不允许访问父类的private 控制的成员变量和成员函数,2.2√和2.3√表示允许访问受protected 和public 控制的成员变量和成员函数,例如第109 行、第118 行等。

(4) 表2-1 中第6 列“子类实例”的访问控制是指在子类实例对父类的成员变量和成员函数的访问控制规律。参照表2-1 可分析下面伪代码操作的合法性:



Point P1(2, 9, Online), P2(2, 9), … //自动调用匹配的构造函数生成P1,P2 类实例



Circle C1(99, 3, 8),…

cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
C1.AssignAPoint(P2); //根据表2-1 的 4.1,不允许





If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759