访问控制与封装

在C++语言中,我们使用访问说明符加强类的封装性:

·定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口。

·定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装(即隐藏了)类的实现细节。

作为接口的一部分,构造函数和部分成员函数紧跟在public说明符之后;而数据成员和作为实现部分的函数则跟在private说明符后面。

一个类可以包含0个或多个访问说明符,而且对于某个访问说明符能出现多少次也没有严格限定。每个访问说明符指定了接下来的成员的访问级别,其有效范围直到出现下一个访问说明符或者到达类的结尾处为止。

class和struct关键字的唯一区别是,默认访问权限不太一样。类可以在它的第一个访问说明符之前定义成员,如果使用struct关键字,则定义在第一个访问说明符之前的成员是public的;相反,使用class,这些成员是private的。

友元

对于作为类的接口一部分而不是类的成员的函数,由于private的限制而无法访问需要访问的成员。

类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。

如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开始的函数声明语句即可。

友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。友元不是类的成员也不受它所在区域访问控制级别的约束。一般来说,最好在类定义开始或结束前的位置集中声明友元。

友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明。为了使友元对类的用户可见,我们通常把友元的声明与类本身放置在同一个头文件中(类的外部)。许多编译器允许在尚无友元函数的初始声明的情况下就调用它,不过最好还是提供一个独立的函数声明。

关键概念:封装的益处

封装有两个重要的优点:

·确保用户代码不会无意间破坏封装对象的状态。

·被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。

尽管当类的定义发生改变时无须更改用户代码,但是使用了该类的源文件必须重新编译。

更多C++基础概念

时间: 2024-10-03 23:01:06

访问控制与封装的相关文章

C++之类之访问控制与封装

先看下封装有什么好处: 1.一旦数据成员被定义成private,类的作者就可以自由修改数据,只要类的接口不变(public),用户代码就无需改变. 2.防止由于用户的原因造成数据被破坏,因为用户无法直接访问到private成员,所以当对象状态被破坏时,只有实现部分的代码采可能产生这样的错误,找bug会大大节省时间. 一.使用public和private封装: 在使用访问说明符之前,user可以直接到达类对象的内部并且控制它的具体实现细节:我们需要使用访问说明符(access specifiers

PHP 类的访问控制与封装private修饰符

<?php /* 封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的                 内部细节,以达到对成员的访问控制--切记不是拒绝访问 private (私有的):被定义为 private 的成员,允许同一个类里的所有成员访问(调用方法是用:$this->方法名), 但对于在该类外调用有private修饰的成员方法和在子类中调用都不允许的. */ header("Content-type: text/html; charset=utf-8&q

【c++ primer, 5e】访问控制与封装

练习 7.16 无,类的接口定义在public说明符之后,类的实现细节定义在private说明符之后. 7.17 有.类成员的默认访问权限不同.class的类成员默认为private,struct的则默认为public. 通常来说,当我们希望定义的类的所有成员是public的时候就用struct. 7.18 p242 7.19 [友元] 练习 7.20 声明的类外函数需要直接引用类内的私有成员的时候要用到友元函数. 设计原因:并非所有的.与某个类相关的函数都适合声明成那个类的成员函数,例如书上的

JavaSE——(五):封装、继承、多态

目录 一.封装 1.1.为什么需要封装 1.2.封装属性 1.3.自动封装属性 1.3.1.创建单个 1.3.2.批量创建 二.继承 2.1. Java继承概要 2.2.为什么需要继承 2.3.实现继承 2.2. Java继承的特征 2.2.1.传递性 2.2.2.单根性 三.构造方法 3.1.构造方法概要 3.2.带参数的构造方法 四.多态 4.1.LSP(里氏代换原则) 4.2.重写(override) 4.3.多态实现 五.示例与视频下载 六.面试题 java面向对象的三大特性是:封装.继

Java多线程编程模式实战指南(一):Active Object模式--转载

本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-object-part1 .转载请注明作者: 黄文海 出处:http://viscent.iteye.com. Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心

《C++ primer 5th》笔记

p,li { white-space: pre-wrap } p,li { white-space: pre-wrap } p,li { white-space: pre-wrap } #类的this 假设有一个类A,total是A的一个对象,isbn()是A的一个成员函数,当我们使用 total.isbn()时,实际上是在替某个对象调用isbn().成员函数通过一个名为this的额外隐式函数来访问调用它的那个对象.当我们调用一个成员函数时,用请求该函数的对象地址初始化this,例如: 调用to

Effective Item - 使可访问性最小化

模块设计是否良好,有个重要的因素在于,相对外部模块是否隐藏内部数据以及实现细节. 设计良好的模块会隐藏实现细节,并将API与其实现隔离开来. 模块之间通过API进行通信,对于内部工作情况互不可见. 即,封装(encapsulation)——软件设计的基本原则之一. 为什么要封装? 通过封装可以有效地接触各个模块之间的耦合关系,使这些模块可以独立地开发.测试.优化.使用.理解和修改. 即: 可以增加开发效率,模块可以并行开发. 封装可以减轻维护的负担,可以更有效的进行优化,且不会影响其他模块的正确

C++我们必须要熟悉的事之具体做法(3)——类的设计与声明

1. 让接口被正确使用 最重要的方法是:保持与内置类型的一致性. 方法1:外覆类型(wrapper types) 例如在需要年月日时,使用 struct day { explicit day(int d) : val(d) { } private: int val; }; 方法2:函数替代对象 class month { public: static month jan() { return month(1); } … private: explicit month(int);    //禁止生

Java多线程编程模式实战指南一:Active Object模式(上)

Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它允许任务的提交(相当于对异步方法的调用)和任务的执行(相当于异步方法的真正执行)分离.这有点类似于System.gc()这个方法:客户端代码调用完gc()后,一个进行垃圾回收的任务被提交,但此时JVM并不一定进行了垃圾回收,而可能是在gc()方法调用返回后的某段时间才开始执行任务--回收垃圾.我们知