2.3 C++类的信息隐藏机制 -- 封装
参考:http://www.weixueyuan.net/view/6335.html
总结:
private、protected和public 限制类中声明的变量和函数在外部的访问权限。
声明为protected属性的成员变量或成员函数,在类外也是不可以访问的,但是其派生类内部确实可以访问的。
C++的这一机制可以使得类对象的使用者只需要关心类是如何使用的,而不需要去关心类内部的实现问题。
访问权限需要分两部分说明:类内和类外。
- 在类内部,无论成员变量或成员函数被声明为private、public或者protected属性,均是可以互相访问的,无访问权限限制。
- 在类外,通过对象无法访问private和protected属性的成员变量和成员函数,而仅可以访问public属性的成员变量和成员函数。
[例1] 定义一个 book 类来说明访问权限:
- #include<iostream>
- using namespace std;
- class book
- {
- public:
- void setprice(double a);
- double getprice();
- private:
- double price;
- };
- void book::setprice(double a)
- {
- price = a;
- }
- double book::getprice()
- {
- return price;
- }
- int main()
- {
- book Alice;
- Alice.setprice(29.9);
- cout<<"The price of Alice is $"<<Alice.getprice()<<endl;
- return 0;
- }
在例 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] 成员变量和成员函数无声明顺序要求:
- class book
- {
- private:
- double price;
- public:
- void setprice(double a);
- double getprice();
- };
[例3] 访问权限相同的成员也可以分开声明:
- class book
- {
- public:
- double getprice();
- private:
- double price;
- public:
- void setprice(double a);
- };
2.3 C++类的信息隐藏机制 -- 封装的更多相关文章
- Qt核心剖析:信息隐藏
原文 http://devbean.blog.51cto.com/448512/326686 (一) 如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q.我们的Qt源码之旅就 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 如何封装JS ----》JS设计模式《------ 封装与信息隐藏
1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法.封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操 ...
- JavaScript设计模式——前奏(封装和信息隐藏)
前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...
- JAVA类型信息——反射机制
JAVA类型信息——反射机制 一.反射机制概述 1.反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备. 2.反射机制的功能 ...
- Android正在使用Handler实现信息发布机制(一)
上一篇文章,我们谈到了电话Handler的sendMessage方法,最后,我们将进入一个电话 sendMessageAtTime方法,例如下列: public boolean sendMessage ...
- jvm系列 (五) ---类的加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- JVM-01:类的加载机制
本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...
- Jvm类的加载机制
1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...
随机推荐
- hystrix两种隔离模式分析
hystrix隔离模式目前有两种方式:信号量模式和线程池模式. 但信号量并不支持超时,当被调服务发生问题时,有少部分用户会长时间无法得到响应. 另外,使用线程池模式无法传递Header,我估计是由于线 ...
- C#学习笔记(八):多维数组
一维数组 冒泡排序 二维数组 Length:取数组元素的总个数 GetLength:取不同维度的个数 using System; using System.Collections.Generic; u ...
- yii2 高级版新建一个应用(api应用为例子)
先在项目的根目录下复制一份 backend 为 api: cp backend/ api -r 拷贝 api 环境 cp -a environments/dev/frontend environmen ...
- Python 以指定宽度格式化输出
当对一组数据输出的时候,我们有时需要输出以指定宽度,来使数据更清晰.这时我们可以用format来进行约束 mat = "{:20}\t{:28}\t{:32}" print(mat ...
- lombok 中的@Data注解
今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...
- JS + flash 复制
js代码ZeroClipboard组件制作复制剪切板复制粘贴文字内容,一键即可复制粘贴文字内容.兼容各大主流浏览器firefox,,Chrome,IE等. 演示代码 如下: <script ty ...
- Hibernate HQL查询 插入 更新(update)实例
1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...
- C#异常信息获取
try { ; / i; } catch (Exception ex) { /** * 1.异常消息 * 2.异常模块名称 * 3.异常方法名称 * 4.异常行号 */ String str = &q ...
- IIS8.5支持WCF
昨天写了个WCF例子,在我电脑上怎么发布都不成功,老是报错. 后来把这个例子放到其他人电脑上发布都没问题,这应该就是我IIS的问题了.我用的是win8.1的系统,IIS版本是8.5,IIS8.5默认是 ...
- ArcGIS API for Silverlight——小滑块
Widgets翻译过来是小玩具.如果使用过Dojo或者ExtJS等js框架肯定会了解到这个“小玩具”也有大用处,能够在很大程度上减少我们的工作量,快速完成功能需求.能减少多大工作量呢?让我们先来,点击 ...