C++成员权限控制(总结)

1) 前言

在我学习C++的过程中,类中成员的权限控制一直是比较头疼的一个点,一会public,一会又private,还有protected,再加点继承,而且又有公有继承、私有继承,保护继承,所以感觉会比较乱。

后来不断学习过程中,慢慢理顺了它们的关系,稍微分类总结一下,在这个问题上基本上就没再栽过跟头。如有笔误,希望大神指点一下!

2 )C++的水平权限控制

首先解释几个特定词,下面要用到:

水平权限:在一个类中,成员的权限控制,就是类中的成员函数能否访问其他成员、类的对象能否访问类中某成员。

垂直权限:在派生类中,对从基类继承来的成员的访问。

内部访问:类中成员函数对其他成员的访问。

外部访问:通过类的对象,访问类的成员函数或者成员变量,有的书里也称之为对象访问。

这里的“水平”是自己为了容易理解而用的,其实也可以用“横向”这类的词,其他的词类似;词的叫法意义不大,但对加深理解却可以事半功倍!

private,public,protected单纯的作为一个类中的成员(变量和函数)权限设置时:

类的成员函数以及友元函数可以访问类中所有成员,但是在类外通过类的对象,就只能访问该类的共有成员。

注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数;这里将友元函数看成内部函数,方便记忆!

 总结为下表:

类中属性

private

protected

public

内部可见性

可见

可见

可见

外部可见性

不可见

不可见

可见

 

程序验证如下:这里没有friend的成员,另外成员变量和成员函数的权限控制是一样的。

 1 #include <iostream> 
 2 
 3 class Foo
 4 {
 5 public:
 6     int a;
 7     void public_fun();
 8 protected:
 9     char b;
10     void protected_fun();
11 private:
12     bool c;
13     void private_fun();
14 };
15 
16 //验证public成员内部可见性
17 void Foo::public_fun()
18 {
19     a = 10;
20     b = 'c';
21     c = true;
22 }
23 
24 //验证protected成员函数的内部可见性
25 void Foo::protected_fun()
26 {
27     a = 10;
28     b = 'c';
29     c = true;
30 }
31 
32 //验证private成员函数的内部可见性
33 void Foo::private_fun()
34 {
35     a = 10;
36     b = 'c';
37     c = true;
38 }
39 
40 int main()  
41 {  
42     Foo foo;
43     foo.public_fun();//验证public成员外部可见性
44     foo.protected_fun();//验证protected成员外部可见性,这里提示错误
45     foo.private_fun();//验证private成员外部可见性,这里提示错误
46     return 0;  
47 }  

3)C++的垂直访问控制

private,public,protected作为继承方式时:

派生类可以继承基类中除了构造函数与析构函数(凡是与具体对象的类别息息相关的都不能被继承,赋值运算符重载函数也不能被继承)之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。

基类中属性

private

protected

public

private

protected

public

private

protected

public

继承方式

               private

              protected

              public

内部可见性

不可见

private

private

不可见

protected

protected

不可见

protected

public

外部可见性

不可见

不可见

不可见

不可见

不可见

不可见

不可见

不可见

可见

派生类对基类成员的访问形式主要有以下两种:

(1)内部访问:由派生类中新增的成员函数对基类继承来的成员的访问。

(2)外部访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问。

4) 有关权限控制的理解

C++的权限控制,给人感觉有点繁琐,特别是三种权限,再加上三种继承方式,还有友元那些东西,非常让人头大,这里总结一下,基本上把最常见和常用的给理清楚啦,一些这方面的问题,比如实际工作或者笔试题目,即可迎刃而解。

原文地址:https://www.cnblogs.com/lizhanwu/p/4423225.html