条款22 将成员变量声明为private

2024-08-28 04:18

本文主要是介绍条款22 将成员变量声明为private,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总结:

     切记声明数据成员为private。它为客户提供了访问数据的一致,细微划分的访问控制,允许约束条件获得保证,而且为类的作者提供了实现上的弹性。

     protec并不比public更具有封装性


不应该将数据成员声明为public的三个理由

一、语法一致性

        如果数据成员不是public的,客户访问一个对象的唯一方法就是通过成员函数。如果在public接口中的每件东西都是函数,客户就不必绞尽脑汁试图记住当他们要访问一个类的成员时是否需要使用圆括号,他们只要使用就可以了,因为每件东西都是一个函数。


二、精确控制成员变量的处理

       如果你让一个数据成员为public,每一个人都可以读写访问它,但是如果你使用函数去得到和设置它的值,你就能实现禁止访问,只读访问和读写访问,甚至只写访问:

class AccessLevels {
public:...int getReadOnly() const { return readOnly; }void setReadWrite(int value) { readWrite = value; }int getReadWrite() const { return readWrite; }void setWriteOnly(int value) { writeOnly = value; }private:int noAccess; // no accessint readOnly; // read-only accessint readWrite; // read-write accessint writeOnly; // write-only access
};
三、封装:

       如果你通过一个函数实现对数据成员的访问,你可以以后改以某个计算来替换这个数据成员,使用你的类的人不会有任何察觉。

例如,假设你正在写一个自动测速程序,当汽车通过,其速度便被计算并填入一个速度收集器内:

class SpeedDataCollection {...public:void addValue(int speed); // 添加一笔新数据double averageSoFar() const; // 返回平均速度...
};     

        现在考虑成员函数averageSoFar的实现:办法之一是在类中用一个数据成员来实时变化迄今为止收集到的所有速度数据的平均值。无论何时averageSoFar被调用,它需返回那个数据成员的值。另一个方法是在每次调用averageSoFar时重新计算,通过分析集合中每一个数据值做成这些事情。

        谁能说哪一个最好?在内存非常紧张的机器(如,一台嵌入式路边侦测设装置)上,或是一个很少需要平均值的应用程序中,每次都计算平均值可能是较好的解决方案;在一个频繁需要平均值的应用程序中,速度比较重要,且内存不成问题,保持一个实时变化的平均值更为可取。重点在于通过一个成员函数访问平均值(也就是说将它“封装”),你能替换这两个不同的实现(也包括其他你可能想到的)。

        封装可能比它最初显现出来的更加重要。如果你对你的客户隐藏你的数据成员(也就是说,封装它们),你就能确保类的约束条件总能被维持,因为只有成员函数能影响它们。此外,你预留了日后变更实现的权利如果你不隐藏你将很快发现,即使你拥有类的源代码,你改变任何一个public的东西的能力也是非常有限的,因为有太多的客户代码将被破坏。public意味着没有封装,没有封装意味着不可改变,尤其是被广泛使用的类。被广泛使用的类是最需要封装的,因为它们可以从一种更好的实现中得益。



为什么不应该声明protected数据成员?

        反对protected数据成员的理由和public数据成员是类似的。关于语法一致性和细微划分之访问控制等理由显然也适用于protected数据,就连封装性上protected数据成员也不比public数据成员更好。

        某些东西的封装性与“当其内容改变时可能造成的代码破坏量“成反比。所谓改变,也许是从类中移除它(就像上述的averageSoFar)。

        假设我们有一个public数据成员,随后移除它,所有使用了它的客户代码都被破坏,其数量通常大得难以置信,因此public数据成员是完全未封装的。但是,假设我们有一个protected数据成员,随后我们移除了它。现在有多少代码会被破坏呢?所有使用了它的派生类都被破坏,典型情况下,代码的数量还是大得难以置信,因此protected数据成员就像public数据成员一样没有封装。在这两种情况下,如果数据成员发生变化,被破坏的客户代码的数量都大得难以置信。一旦你声明一个数据成员为public或protected,而且客户开始使用它,就很难再改变与这个数据成员有关的任何事情。有太多的代码不得不被重写,重测试,重文档化,或重编译。

       从封装的观点来看,实际只有两个访问层次:private(提供了封装)与其他(没有提供封装)


这篇关于条款22 将成员变量声明为private的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113706

相关文章

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的