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