参考: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 2155 Matrix (二维树状数组)题解

    思路: 没想到二维树状数组和一维的比只差了一行,update单点更新,query求和 这里的函数用法和平时不一样,query直接算出来就是某点的值,怎么做到的呢? 我们在更新的时候不止更新一个点,而是 ...

  2. MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

    查询所有数据库占用磁盘空间大小的SQL语句: ,),' MB') as data_size, concat(,),'MB') as index_size from information_schema ...

  3. 论文笔记:Mastering the game of Go with deep neural networks and tree search

    Mastering the game of Go with deep neural networks and tree search Nature 2015  这是本人论文笔记系列第二篇 Nature ...

  4. ros 启动launch文件,附带参数

    roslaunch cartographer_ros cartographer_ref.launch resolution:=0.07 #下面是cartographer_ref.launch的内容 & ...

  5. Window系统下用Ant实现Java项目的自动构建和部署

    https://blog.csdn.net/xinxin19881112/article/details/7297021 Step 1: 从官网下载Ant包,官网地址http://ant.apache ...

  6. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  7. Unity 4.x 资源打包

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; pu ...

  8. Android 使用SQLite

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...

  9. apache安装方式

    1.首先需要下载apachi,apache_2.2.22.msi 2.双击安装包进行安装,安装过程中可能出现一些选择性问题,将重点部分截图如下: 说明:这三个内容就按如上输入即可. 说明:选择自定义安 ...

  10. Windows 2008 更改网卡绑定顺序

    用 ncpa.cpl 或者用鼠标右键点网上邻居进去也好. 来到网卡列表画面. 然后,你会发觉没有菜单去操作[高级设置], 这里,最高级的步骤来了, 就是你需要按一个 [Alt]把菜单给显示出来,太神奇 ...