在OOP中,Private成员对于谁是私有的
In OOP, Private membes are private for who?
在OOP中为什么需要放一些东西,例如Private
。我知道,任何私有成员不能访问,但与相同的类对象。但为什么我需要这样做,而我是我的项目的唯一编码。同样的问题延伸到Protected
,保护谁!
private
和protected
不是为了防止其他编码器访问类的内部,而是(也)防止您自己创建没有明确定义接口的程序。
如果项目中的每个类都可以修改其他类,那么由于巨大的状态空间,您不仅容易引入bug,而且还会防止自己:
- 改变任何类的实现(同时保持接口不变)
- 不要把不熟悉所有类的内部原理的人介绍给项目。除非你有完美的记忆力,能背诵你写过的每一行代码,否则未来的你也不例外。
- 模拟对象用于单元测试
- 与程序/库的其他版本交互。假设您确实更改了一个类的内部属性,并且您设法跟踪了项目中对该内部属性的每个引用。即使这样,您也可能需要再次与旧版本的程序进行交互。如果使用属性而不是getter/setter方法,这会变得特别困难。
访问修饰符实现两种不同的功能:
-
它们限制了可能导致副作用的代码量,使建立不变量变得更容易。
-
保护类的客户端不受内部表示变化的影响。
对于小型项目,这些优势可能不会立即可见,特别是对于初学者。
防止将来的自己不小心忘记对象的哪些部分是应该与系统其余部分解耦的细节,哪些部分是系统其余部分可以依赖的可靠接口。
语言试图强迫你写"好的"代码。"好"意味着代码是结构化的,干净的,不容易出错。所以你必须声明类型,私有成员等等。如果你不想这样,你可以使用一种在这方面不那么重要的语言,比如python。但这意味着,您的程序可能(可能!)更不安全,或者如果它变得非常大,很容易被误解。这和注释是一样的。你不必写它们。尤其是当你是唯一的程序员时。但这是一种很好的风格,如果你在半年后再读你的程序,你会非常感激的。
将类private
的成员标记为不能从类外访问。例如,你可以用它来隐藏实现细节,这样你就可以在不影响其他代码的情况下使用你的类来改变实现。隐藏实现细节是OOP(封装)的关键方面之一。如果你创建了一个Car
类,然后你写了很多使用Car
类的代码,然后你突然意识到你的实现性能很差,你需要重构它,如果所有的Car
实现细节都是Car
类私有的,你知道使用Car
的代码都不会访问这些东西,你可以随意改变它们。如果您没有将它们标记为private
,那么您可能在其他代码中使用了其中的一些,然后这些代码将会中断。
protected
(无论如何在Java中)也是出于同样的目的,但允许从您的类派生的类访问这些成员。这是相当弱的保护,因为这当然意味着您不能在不影响派生类的情况下更改基类的实现细节。
这样考虑:保护级别定义了以后可以更改的内容,而不需要考虑除该类之外的任何其他代码段(私有),不需要考虑除该类之外的任何其他代码段和从该类继承的每个类(受保护),也不需要考虑除使用该类的每个代码段之外的任何其他代码段(公共)。
private
或protected
来自封装概念。它来源于数据隐藏的概念。我相信这个介绍至少对我来说是清晰和有用的:
封装是将数据和功能组合成一个单个单位称为类。采用封装的方法,将程序员不能直接访问数据。数据仅供查阅通过类中存在的函数。数据封装引出了数据隐藏的重要概念。数据隐藏是对用户隐藏的类的实现细节。的限制访问的概念导致程序员编写专门化用于对隐藏成员执行操作的函数或方法在班上。必须注意,以确保班级正确地设计。(Sripriya Rajagopalan)
注意:答案很好,这个答案是完成它们
如果您将类的成员(变量或方法)定义为私有,则无法从外部使用它,使用另一个类,使用点操作符。Protected帮助您保护成员变量或方法不被继承。
- 如何仅使用对象名称打印特定于对象的成员
- 如何添加依赖于类本身的模板成员变量
- 初始化依赖于子类的继承类的常量类成员
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 非静态成员引用必须相对于特定对象
- 类成员函数参数列表是否可以依赖于模板参数?
- 专用于可变参数模板成员函数
- 依赖于类成员属性的类实例成员
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- QT:添加到QMenu后,谁是QActionGroup成员的父级
- 将 c++ 类成员函数专用于模板类
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 如何在未评估的上下文中将成员函数的结果类型应用于类成员
- 我该如何文档文档以使文档适用于类成员而不是匿名类型
- CMAKE OS X 故障 AR 没有特定于存档成员
- C++11的"default"只能应用于特殊成员功能吗?
- 如果我们将 std::cout 应用于指向成员的指针,我们将获得什么值
- 类型特征相对于静态成员的优势
- 类中包含依赖于类成员的模板
- 类似于虚拟成员(结构)的东西