接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private。

理解他就先从期望他达到的效果先说吧

Public: 使成员对于整个程序内(类内类外)都是可以访问的

Protected: 使派生类也可以访问其数据,但是又不想让其他的函数或类进行访问

Private: 只有他所在类的成员函数可以访问

在没有继承这一概念前,我们先只研究public与private就够了。

简单说,private实现的就是一种封装,让类的对象(C++primer里面叫类的用户)不能直接访问,而public让成员可以被程序的任何地方访问到。

比如:

class Base
{
public:
char a=’a’;
ChangeB(charmychar){return b= mychar };
enum num{
E_a,
E_b
}
private:
char b=’b’;
}
Base base1;
base1.a=’2’;//正确
base1.b=’2’;//错误,不能访问私有成员
base1.Show();//正确,实现了封装
Base:: num print(int tnum) //public 可以直接通过作用域访问
{
if(tnum==1) return E_a;
}

下面谈一下protected,在此之前简单说一下继承:定义相似的类型结构并以此进行建模,可以使设计的数据结构清晰易懂,同时可以实现封装和多态。简单举例来说,有一个动物的类型,里面包括老虎,狮子,猴子等,那可以把动物看做一个基类,猴子等看做一个派生类,猴子继承于动物类,可以实现更多更丰富的操作。其他有关继承概念的不在赘述~

Protected理解上就是private和public的中和,与private相似的是同样不能被类的对象(类的用户)访问,但是可以被派生类和友元访问。

下面有一个关于protected的比较难理解的结论:

派生类的成员或友元只能通过派生类对象来访问基类的受保护对象(即protected对象)。派生类对于一个基类对象中的受保护成员没有任何访问特权。

要解释这句话,首先要理解继承的机制,当一个派生类继承一个基类的时候,他就同时继承下来了基类的成员变量,也就是说这个类对象里面包含的不仅仅是自己的成员变量,还有基类的,而派生类构造的时候也要先执行基类的构造函数。

上面的”通过派生类对象来访问基类的受保护对象”意思就是可以通过基类的派生类对象访问该protected成员,因为派生类中包含基类的protected成员(继承下来的)。但是不可以直接通过访问基类对象来访问protected对象。下面举个例子:

class Base
{
protected:
char a=’a’;
}
class Son: public Base
{
voidprintBase(Base &b)
{
b.a=’1’; ///////错误,不能直接通过类访问protected成员
}
voidprintSon(Son &s)
{
s.a=’2’;
}
}

了解了类中作用域的访问控制,再看一下公有,私有,受保护的继承:

class Base
{
public:
char a=’a’;
changeB(char mychar){return b= mychar};
protected:
charb=’b’;
private:
char c=’c’;
}
struct Son1:public Base
{
CharreturnC(){ return c;} ////错误,私有变量只有类内部成员可以访问
CharreturnB(){ return b;}
CharreturnA(){ return a;}
}
struct Son2:private Base
{
charreturnC(){ return c;} ////错误,私有变量只有类内部成员可以访问
charreturnB(){ return b;} //private继承不影响派生类对基类的访问权限
charreturnA(){ return a;}
}
Son1 s1;
Son2 s2;
s1.returnA(); //正确,a在派生类Son1中是public的
s2.returnA(); //错误,a在派生类Son2中是privat的

这里要知道的是,派生类的继承访问控制影响的是派生类中成员的访问权限,不影响派生类访问基类的权限。也就是说,基类的访问控制没有变化,而派生类可以理解成下面这样~

struct  Son1:public Base
{
public:
char a=’a’;
protected:
char b=’b’;
}
struct Son2:private Base
{
private:
chara=’a’;
char b=’b’;
}

所以,这时候son1的对象(用户)可以访问到a,但是son2的对象不能访问到a了。

可以把这个理解为 public继承原来的访问权限都不变,protected继承就’降级’,private就变为都是私有的。

如果细心的话可能注意到两点疑问:

1.      为什么我的Son1和Son2里面没有写char
c?

2.      Struct继承class如何理解?

答1:我们知道,子类根本没有权限访问父类的private,所以派生类根本就没有c这个字符串。(不过我理解可能调用基类构造函数的时候也初始化了c,然而被隐藏起来)

答2:struct和class在C++中都可以是类声明的关键字,实质上没有什么差别。唯一的区别就是struct类中的成员默认是public的。而class内的成员默认是private的。当然,我们平时也可以把struct当成c语言中的结构体来使用。

补充:假设a继承于b

1只有a公共的继承基类时,用户代码才能使用派生类向基类转换。

2 a如果是公共继承或受保护继承的,则a的派生类的成员可以使用a到b的类型转换

快速理解类的访问控制(public,protected,private)的更多相关文章

  1. 访问控制public/protected/private的区别

    Java支持四种不同的访问权限: 修饰符 说明 public 共有的,对所有类可见. protected 受保护的,对同一包内的类和所有子类可见. private 私有的,在同一类内可见. 默认的 在 ...

  2. C++ 访问控制 public, protected, private, 友元

    1. 变量属性与继承之间的关系 #include <iostream> using namespace std; class A { public: int x; protected: i ...

  3. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  4. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

  5. C++中public,protected,private派生类继承问题和访问权限问题

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  6. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  7. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  8. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  9. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

随机推荐

  1. NFS Server搭建实践

    NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个 ...

  2. 机器学习: 基于MRF和CNN的图像合成

    前面我们介绍了基于卷积神经网络的图像风格迁移,利用一张content image 和 style image,可以让最终的图像既保留content image的基本结构,又能显示一定的style im ...

  3. 斯托克斯定理(Stokes' theorem)

    1. 几种形式 ∮∂SPdx+Qdy+Rdz=∬S∣∣∣∣∣∣cosα∂∂xPcosβ∂∂yQcosγ∂∂zR∣∣∣∣∣∣dS ∮∂Ωw=∬Ωdw 左边是内积: 右边是外积: 物理上的应用: ∮∂SE ...

  4. 有关C++中String的一些知识

    在C++中,String 是一个类,相当于其他简单的类一样,它之中也包含很多简单的处理字符串的函数. 具体见 已下载好的String 类的基本操作 PDF.(大学那点事)

  5. ssm框架插入mysql数据库中文乱码问题解决

    1.      检查web.xml <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-n ...

  6. 分类算法SVM(支持向量机)

    支持向量机(Support Vector Machine ,SVM)的主要思想是:建立一个最优决策超平面,使得该平面两侧距离该平面最近的两类样本之间的距离最大化,从而对分类问题提供良好的泛化能力.对于 ...

  7. python 教程 第六章、 模块

    第六章. 模块 1) 模块 sys模块 字节编译的.pyc文件,优化编译后生成pyo文件 2) from..import语句 import sys print 'The command line ar ...

  8. TemplatePart用法说明

    原文:TemplatePart用法说明 TemplatePart(Name="PART_Decrease", Type=typeof(RepeatButton)) 一直没明白这是干 ...

  9. Mybatis常用操作 专题

    parameterType:即将传入的语句参数的完全限定类名和别名.这个属性是可选项的,因为MyBatis可以推断出传入语句的具体参数,因此不建议配置该属性flushCache:默认值为true,任何 ...

  10. MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制

    最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...