参考: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. POJ 2785 4 Values whose Sum is 0 (二分)题解

    思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...

  2. ActiveMQ 集群配置 高可用

    自从activemq5.9.0开始,activemq的集群实现方式取消了传统的Pure Master Slave方式,增加了基于zookeeper+leveldb的实现方式,其他两种方式:目录共享和数 ...

  3. hive学习4(hive的脚本执行)

    hive的脚本执行 hive -e "SQL" hvie -f file 实例 [root@spark1 ~]# hive -e "show tables" # ...

  4. 51nod 1444 破坏道路(最短路)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1444 题意: 思路: 哇,思路爆炸. 因为每条边的权值都为1,所以可以直 ...

  5. gcc 编译出现 internal compiler error: Killed

    系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断 …解决方式也很简单, 就是增加一个交换分区:       创建分区文件, 大小 2G dd if=/dev/zero of=/swapfile ...

  6. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  7. 《WAP团队项目需求分析改进》

    基于原型的团队项目需求调研与分析 本项目是一个家教系统的实现,随着时代的进步,现今已经进入信息技术时代,越来越多的人注意到了教育的重要性.家长对于孩子的学习提高注意力,大家都不想自己的孩子输在起跑线上 ...

  8. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  9. 批量删除Redis数据库中的Key

    批量删除KeyRedis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作 redis-cli keys &q ...

  10. Linux后台日志定时清理脚本

    一. 简介 linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否 ...