参考:http://www.weixueyuan.net/view/6335.html

总结:

  private、protected和public  限制类中声明的变量和函数在外部的访问权限。

  声明为protected属性的成员变量或成员函数,在类外也是不可以访问的,但是其派生类内部确实可以访问的。

类中可以声明变量和函数,为了将类对象的内部实现与外部行为分离开来,C++语言为类提供了封装机制,与之相关的三个关键字分别是:private、protected和public,这三个关键字所代表的含义分别为私有、受保护和公用。三个关键字的作用就是限制类中声明的变量和函数在外部的访问权限。

C++的这一机制可以使得类对象的使用者只需要关心类是如何使用的,而不需要去关心类内部的实现问题。

访问权限需要分两部分说明:类内和类外。

  • 在类内部,无论成员变量或成员函数被声明为private、public或者protected属性,均是可以互相访问的,无访问权限限制。
  • 在类外,通过对象无法访问private和protected属性的成员变量和成员函数,而仅可以访问public属性的成员变量和成员函数。

[例1] 定义一个 book 类来说明访问权限:

  1. #include<iostream>
  2. using namespace std;
  3. class book
  4. {
  5. public:
  6. void setprice(double a);
  7. double getprice();
  8. private:
  9. double price;
  10. };
  11. void book::setprice(double a)
  12. {
  13. price = a;
  14. }
  15. double book::getprice()
  16. {
  17. return price;
  18. }
  19. int main()
  20. {
  21. book Alice;
  22. Alice.setprice(29.9);
  23. cout<<"The price of Alice is $"<<Alice.getprice()<<endl;
  24. return 0;
  25. }

在例 1 中,声明了一个book类,该类中有一个成员变量price,表示书本的价格属性,另外有两个成员函数,分别是用于设置价格的setprice函数和获取书本价格的getprice函数。

类中成员变量price被设置成了private属性,而两个成员函数则设置成了public属性。声明为private属性的成员变量或函数,在类外是不可访问的,而声明为public属性的成员变量或函数,在类外可以访问。

另外还有一个关键字protected,声明为protected属性的成员变量或成员函数,在类外也是不可以访问的,但是其派生类内部确实可以访问的,这在后面将会重新介绍,在此处,我们只需要知道protected在类外无法访问即可。

回到例1,在主函数中,声明book的对象Alice,调用book类中的函数setprice为Alice这本书设置价格,其价格被设置为29.9元。之后再调用book类中的getprice函数,将其价格打印出来。

在例1中,我们不能直接访问price这个成员变量,因为其属性被设置为private了,但是类中提供了两个public属性的成员函数可以供我们操作price这个变量。

除了像例1那样声明book类以外,按照例2及例3那样声明变量也都是可以的,类内部成员变量及函数声明变量顺序可以是任意的。

[例2] 成员变量和成员函数无声明顺序要求:

  1. class book
  2. {
  3. private:
  4. double price;
  5. public:
  6. void setprice(double a);
  7. double getprice();
  8. };

[例3] 访问权限相同的成员也可以分开声明:

  1. class book
  2. {
  3. public:
  4. double getprice();
  5. private:
  6. double price;
  7. public:
  8. void setprice(double a);
  9. };
 

2.3 C++类的信息隐藏机制 -- 封装的更多相关文章

  1. Qt核心剖析:信息隐藏

    原文 http://devbean.blog.51cto.com/448512/326686 (一) 如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q.我们的Qt源码之旅就 ...

  2. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  3. 如何封装JS ----》JS设计模式《------ 封装与信息隐藏

    1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法.封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操 ...

  4. JavaScript设计模式——前奏(封装和信息隐藏)

    前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...

  5. JAVA类型信息——反射机制

    JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...

  6. Android正在使用Handler实现信息发布机制(一)

    上一篇文章,我们谈到了电话Handler的sendMessage方法,最后,我们将进入一个电话 sendMessageAtTime方法,例如下列: public boolean sendMessage ...

  7. jvm系列 (五) ---类的加载机制

    类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...

  8. JVM-01:类的加载机制

    本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...

  9. Jvm类的加载机制

    1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...

随机推荐

  1. java 正则表达式验证邮箱格式是否合规 以及 正则表达式元字符

    package com.ykmimi.testtest; /** * 测试邮箱地址是否合规 * @author ukyor * */ public class EmailTest { public s ...

  2. grpc python quickstart

    参考:grpc python quickstart 准备 1.升级pip $ python -m pip install --upgrade pip 2.安装grpc $ python -m pip ...

  3. self用法

  4. jquery 封装插件

    如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...

  5. (转)Linux I/O 调度方法

    Linux I/O 调度方法 转自https://blog.csdn.net/theorytree/article/details/6259104 操作系统的调度有 CPU调度    CPU sche ...

  6. hdu 5651 xiaoxin juju needs help 逆元 两种求解方式

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  7. 《F4+2》—团队项目系统设计改进与详细设计

    一.团队项目系统设计改进: 1.分析项目系统设计说明书初稿的不足,特别是软件系统结构模型建模不完善内容 在上一次的项目系统设计说明书中没有很好的完成软件系统结构模型的建模设计,只做了基本的系统项目原型 ...

  8. 20170711xlVBA批量制图一例

    Public Sub GatherDataPicker() Application.ScreenUpdating = False Application.DisplayAlerts = False A ...

  9. spoj The Next Palindrome

    题意:比给出的数大的最小回文数. 先用前n/2长对称到后面,如果没变大,在中间加1,进位,再对称. //#pragma comment(linker,"/STACK:1024000000,1 ...

  10. codeforces 487a//Fight the Monster// Codeforces Round #278(Div. 1)

    题意:打怪兽.可增加自己的属性,怎样在能打倒怪兽的情况下花费最少? 这题关键要找好二分的量.一开始我觉得,只要攻击到101,防御到100,就能必胜,于是我对自己的三个属性的和二分(0到201),内部三 ...