Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中,声明类变量为私有总是好的吗?_C++_Object Oriented Analysis - Fatal编程技术网

在C++中,声明类变量为私有总是好的吗?

在C++中,声明类变量为私有总是好的吗?,c++,object-oriented-analysis,C++,Object Oriented Analysis,在Java中,通常建议将类变量声明为private。 我想知道C++也是,就像java一样。但如果是的话,问题是,正如我所想,大多数类都应该有get,set函数,我认为这很麻烦。但如果是好的编程习惯,我会遵循它。请分享你的意见 您正在谈论的东西叫做封装。现在,有了这个术语,你应该能够找到正确的定义,但你也应该能够找到使用它的理由。一旦您理解了封装的原因,您将能够权衡解决任务的成本和收益,从而决定是否使用它 顺便说一句,这些原则完全独立于您使用的编程语言,尽管它们在不同的语言中可能采用不同的形式。

在Java中,通常建议将类变量声明为private。
我想知道C++也是,就像java一样。但如果是的话,问题是,正如我所想,大多数类都应该有get,set函数,我认为这很麻烦。但如果是好的编程习惯,我会遵循它。请分享你的意见

您正在谈论的东西叫做封装。现在,有了这个术语,你应该能够找到正确的定义,但你也应该能够找到使用它的理由。一旦您理解了封装的原因,您将能够权衡解决任务的成本和收益,从而决定是否使用它

顺便说一句,这些原则完全独立于您使用的编程语言,尽管它们在不同的语言中可能采用不同的形式。

如果您的类只是一个数据成员的集合,比如C结构,那么最好还是使用公共成员

但是,C++类比C结构更强大。特别是,它有一个公开给用户的公共接口和一个私有部分,这有助于公共接口的实现,但对用户是隐藏的。通过这种方式,可以在不影响类可用性的情况下修改私有接口


getter和setter不一定是公共接口的一部分。

您可能知道,您所谈论的是封装。它有几个优点

假设您有一个类,每X秒从传感器获取一次温度。你肯定会有一个包含温度的变量。如果你的变量是公共的,那么每个人都可以写

std::cout << "temperature is : " << temperatureReader.temperature << " °C";
当然,这是邪恶的,但我可以做到,记住,你的类必须易于有效地使用,并且很难使用不好。但是如果您创建了一个setter,那么您就能够控制变量中的内容

OOP还有一个重要的方面,即坚实的原则:


公共变量也由您的子类继承,您可能不会这样做

这完全取决于你想要什么。如果您想要一个C风格的结构样式,可以访问原始数据,那么这不是您想要的。如果您想在set或get上执行其他操作,setters/getter是一种方法。这取决于具体情况。例如,std::stack有一个受保护的数据成员。在嵌入式系统中呢?请给我一些建议。将类成员声明为私有不是好的java设计,而是好的面向对象设计。您希望封装尽可能多的类功能。您编写的访问私有成员的函数越多,类的封装就越少。这并不是对创建函数的可怕警告,它只是意味着不要自动创建访问器和变异器函数。一个是小型和快速,以克服平台的限制。另一个是永远不会崩溃。慢速很糟糕,但如果自动驾驶仪坠毁,飞机可能会跟着。这通常被认为是非常非常糟糕的。对我来说,封装是为了自卫。每个对象都使用编写良好的getter和setter来保护自己的状态,这些getter和setter用于需要共享的数据,而不是不需要共享的数据。从偏执狂开始,锁定一切。执行将告诉您是否有东西太慢,探查器将告诉您是否是您如何配置访问器的。在那之前,你要谨慎行事。
temperatureReader.sensor = nullptr;