C++ 中对于访问权限publicprivateprotected的理解

Posted 玛丽莲茼蒿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中对于访问权限publicprivateprotected的理解相关的知识,希望对你有一定的参考价值。

为什么要借助C++去理解,因为C++对于public、protected、private的划分更符合(我的)逻辑

1. private成员只有该类自身可以访问

2. protected成员只有该类及其派生类可以访问

3. public成员所有的人都可以访问

而对于java,protected不仅对该类及其派生类可以访问,对包内的类也可以访问,这让我不是很理解。

转载理解(一)

        那么首先,需要澄清的一个关键点是,是要控制谁访问谁的权限?这个访问的主语(施事)是谁?宾语(受事)是谁?
    我们经常听到这样的说法:

  1. private成员只有该类自身可以访问,protected成员只有该类及其派生类可以访问,public成员所有的人都可以访问。

        宾语(受事)是谁这一点很明确,是类的成员(包括成员变量及成员方法)。主语(施事)是谁?这是让大家发生混淆的关键点。也是这个说法中含糊不清的地方。想清楚一点,其实主语(施事)指的是一个函数,而不是类(当然更不是变量)。private/public/protected要控制的是一个函数(施事)对一个类的成员(包括成员变量及成员方法)的访问权限。因此比较完整的说法是:

1)一个类友元(包含友元函数或者友元类的所有成员函数)可以访问该类的任何成员(包括成员变量及成员方法)。

2)除去友元外,private成员只有该类自身的成员函数可以访问,protected成员只有该类的成员函数及其派生类的成员函数可以访问,public成员则所有的函数都可以访问。 也就是说,当我们说一个类可以访问XXX,其实暗指这个类的成员函数可以访问XXX。

转载理解(二) 

 在自己编写代码或者阅读别人的代码时,我们经常会遇到类的访问限制符public,private,protected。对于前两个public和private的使用我们很好理解:

1. 类成员变量一般修饰为private,防止类使用者不受约束地直接修改数据;
2. 类成员函数一般修饰为public,提供给使用者进行调用;
3. 某些类成员函数有时候也修饰为private,方便类内的成员函数在实现某些稍微复杂的功能是去调用,而对于类的使用者,无需了解到类内的方法是如何实现的。


    那么问题来了,protected在什么情况下使用呢?
    说到protected,就不得不提到C++面向对象的一大特性:继承。如果没有继承这个机制,也就无需有protected存在的意义。如果一个类用protected修饰其成员变量或者函数,那么这个类的子类可以拥有访问这个成员变量或者函数的权利,而其他类仍然像private的限制一样无法访问这个类的protected成员。
    这样,重点来了。我认为,protected用在这样一个场合:用protected修饰的成员一般具有很高的而且相对基础使用价值。也就是说,其他类内的成员函数在实现自己功能的时候,会使用到protected修饰的成员。那么,具有这么高的使用价值,这么个宝贝,在继承的时候,就应该提供给自己的子类。这也是对“继承”的直观理解。这样,基类的子类在实现自己的成员函数或者重写基类的成员函数的时候,就可以调用基类protected修饰的成员来使用。
    但是,为什么不直接把这样的成员用public修饰呢?我想是因为为了保持类对外使用的简洁性。类只要把自己的基本功能提供给使用者,至于这些功能的实现细节,是否用到了其他的函数,外界不需要知道也不能知道,只有自己的子类知道而且可以使用,因为它是继承人。
 

以上是关于C++ 中对于访问权限publicprivateprotected的理解的主要内容,如果未能解决你的问题,请参考以下文章

C++中类和结构体的区别

C++入门访问权限管控和继承机制详解

java与c++的访问权限的问题

C++类基础部分详解

关于C++类成员访问权限的理解

回顾C++:访问权限控制之 公有保护私有继承用法详解与总结