Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果在类成员函数的定义中使用全局变量,是否会违反封装?

如果在类成员函数的定义中使用全局变量,是否会违反封装?
EN

Stack Overflow用户
提问于 2016-03-05 10:49:16
回答 2查看 1.6K关注 0票数 6

有人要求我解释什么是封装,我回答说:“将修改数据的数据和函数捆绑在一起,称为封装。”

答案之后是另一个问题--“因此,根据您的定义,如果我从类的成员函数修改全局变量,那么封装就会被违反。”

回答是的是有道理的。

我不知道我的解释是错的还是下面的问题是正确的,我对它的回答是正确的。

有人能帮忙吗。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-05 11:04:36

引用维基百科

在编程语言中,封装用于指两个相关但不同的概念之一,有时还指其中的组合:

  • 一种语言机制,用于限制对对象的某些组件的访问。
  • 一种语言结构,它有助于将数据与操作在该数据上的方法(或其他函数)捆绑在一起。

在我看来,后续问题的答案是主观的,这取决于对封装概念的解释。

例如,如果封装数据被限制为类的成员变量,则不会发生冲突。每个人都可以访问不属于对象的全局变量,因此,通过成员函数访问它并不包含任何封装冲突。

另一方面,如果您认为封装应该应用于整个程序,那么这个全局变量应该绑定到一个对象,因此,对它的原始访问构成了封装冲突。

底线是,答案在于神学领域,这意味着它取决于封装是如何解释不同的编程教条。

票数 1
EN

Stack Overflow用户

发布于 2016-03-05 11:04:49

这取决于如何定义和访问全局变量。

假设头文件包含声明,但不包含成员函数的定义,以及包含类成员实现的相应实现文件。

现在,将此头文件中定义的全局变量定义为内部链接1 (static)。或放置在未命名的命名空间中。它是一个全局变量,但在功能上与private static类成员没有区别。

这是难闻的代码,但是,我要说,这个变量是正确封装的:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35818314

复制
相关文章
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
2K0
C++类的成员函数 | 成员函数
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
请问以上代码的 ~Foo 是否可以在垃圾回收执行,或者说在构造函数里面抛出异常,是否这个对象可以被垃圾回收
林德熙
2021/12/24
5040
C++类声明和成员函数定义 | 引用多个成员对象
在C++中,一般做法是将类的声明放在指定的头文件中,程序员如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工 作量,提高编程的效率。
小林C语言
2021/01/25
2K0
C++类声明和成员函数定义 | 引用多个成员对象
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
类的成员方法 , 就是 在 类 中定义的 函数 , 在该 函数 中 , 可以调用 类的成员变量 , 以及 本类中其它的成员方法 ;
韩曙亮
2023/10/11
5060
【Python】面向对象 ② ( 类的定义和使用 | 类的成员方法 | 类成员方法定义语法 | self 关键字 )
Python 检测成员函数、成员变量是否存在的方法
AttributeError: A instance has no attribute 'fun2'
用户9127725
2022/08/08
2.9K0
Java继承类中static成员函数的重写
在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性。让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testCla
老白
2018/03/19
1.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
针对类中特定成员函数的检测其实在工作中也可能用到。C++中可以用SFINAE技巧达到这个目的。
果冻虾仁
2021/12/20
4.7K0
C++设计模式之SFINAE:用来检测类中是否有某个成员函数
java反射详解与反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2019/01/15
2.3K0
taro中定义以及使用全局变量
错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = { name: '张三', id: 1 }; } } // index.tsx 文件中 const app = Taro.getApp(); export default class Index extends Component { componentWillMount() { console.log(ap
用户1437675
2019/06/11
5.7K0
const修饰类中成员变量及函数
const在类中,可以修饰成员变量和成员函数,主要目的也是保护成员内部的一些属性不被轻易的修改。以保证数据的完整性。下面分别介绍const修饰成员变量和成员函数。
我与梦想有个约会
2023/10/20
3100
C++类成员的访问权限以及类的封装
C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。
芯动大师
2023/10/14
4230
C++类成员的访问权限以及类的封装
C++中的空类默认包含哪些类成员函数
空类 class Empty { } 空类包含的函数(6个) class Empty { public: Empty(); // 缺省构造函数// Empty( const Empty& ); // 拷贝构造函数// ~Empty(); // 析构函数// Empty& operator=( const Empty& ); // 赋值运算符// Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const };
全栈程序员站长
2021/04/07
1.7K0
类A的成员函数做类B的友元函数
这种方法相对麻烦,主要是在两个类之间的前后声明有着复杂的逻辑关系。但只要我们理清思路,是可以实现的。跟着我从最初的想法到实现一步一步的理顺逻辑,就非常容易理解如何操作了。
我与梦想有个约会
2023/10/20
1930
类A的成员函数做类B的友元函数
java反射详解【转】与 反射是否会破坏类的封装性见解
       首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)
洋仔聊编程
2022/05/10
7120
java反射详解【转】与 反射是否会破坏类的封装性见解
Python中类的成员
细分类的组成成员 之前咱们讲过类大致分两块区域 class A: name = '陈松' # 第一部分:静态字段(静态变量)部分(这一部分调用了类自己本身,表示了类自己的自身属性) def __init__(self): pass def func(self): pass # 第二部分:方法部分(这一部分表示了类可以实施的方法,可以 自己或其他进行操作) 每个区域详细划分 class A:#在方法名前面带__的属于私有 compan
星陨1357
2023/03/14
1K0
Python中类的成员
C++中类和对象以及成员函数
一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,在C++中实体对应的就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。
用户7886150
2021/02/04
1.4K0
C++中类成员函数作为多线程的入口
搜了一圈答案,基本上都是启动线程的时候传入this指针,在线程函数内部再强转的解决方案。可能显得有些别扭。
ApacheCN_飞龙
2019/02/15
2.9K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
可以使用 对象名.‘成员名’ 访问 Groovy 类的成员 , 这样写的好处是 , 不用将代码写死 , 在运行时可以自由灵活的决定要访问哪个成员 ;
韩曙亮
2023/03/30
2.5K0
【Groovy】Groovy 方法调用 ( 使用 对象名.成员名 访问 Groovy 类的成员 | 使用 对象名.‘成员名‘ 访问类的成员 | 使用 对象名[‘成员名‘] 访问类成员 )
【Kotlin】Kotlin 面向对象 ( 类 | 成员变量 | 成员方法 | 封装 | 继承 | 多态 )
② 定义字段 : 在类后的括号内 , 使用 var 字段名称:字段类型 可以定义一个字段 ;
韩曙亮
2023/03/27
6610
C++类的静态数据成员和静态成员函数
一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相同的属性,那么意味着我们需要对它们统一操作,这就有可能出现它们的值会不一样的情况,如果用全局变量来描述它们相同的属性,就会破坏类的独立性。
叶茂林
2023/07/30
2980

相似问题

函数参数是否违反封装?

25

朋友函数是否违反封装?

20

传递lambda在使用私有成员变量时是否违反了封装?

14

Kotlin是否违反了封装规则?

23

在类定义内定义成员函数与在类定义之外定义成员函数之间是否有区别?

56
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档