使用太多的静电是好还是坏?
我喜欢在C ++中使用静态函数作为对它们进行分类的一种方式,例如Cdoes。
Console::WriteLine("hello")
这是好事还是坏事?如果经常使用这些功能,我想没关系,但是如果没有使用,它们会对内存造成压力吗?
那"静态常量"呢?
解决方案
回答
我全都使用静态函数。这些特别有意义,尤其是在组织成模块时(在C#中为"静态类")。
但是,当这些函数需要某种外部(非编译时const)数据时,则应将该函数作为实例方法,并将其数据封装到一个类中。
简而言之:静态功能正常,静态数据不良。
回答
在这里同意Frank的观点,静态(全局)函数没有问题(当然,只要它们是有组织的)。当人们认为"哦,我将使这部分数据的范围成为宽一点。..滑坡:)
真正地看待它。.函数式编程;)
回答
静态数据不好的一个特定原因是C ++不保证静态对象在不同转换单元中的初始化顺序。实际上,当一个对象依赖于另一个翻译单元中的另一个对象时,这可能会引起问题。斯科特·迈耶斯(Scott Meyers)在他的书《更有效的C ++》第26条中对此进行了讨论。
回答
我倾向于使类包含静态函数,但有人说"正确的方法"通常是使用名称空间。 (我在C ++具有名称空间之前就养成了习惯。)
顺便说一句,如果我们有一个仅包含静态数据和函数的类,则应将构造函数声明为私有的,因此没有人尝试实例化它。 (这是有人争用名称空间而不是类的原因之一。)
回答
but is it good or bad
我想到的第一个形容词是"不必要的"。 C ++具有免费的函数和名称空间,那么为什么要在类中将它们设为静态函数呢?
在Cand Java的无法实例化的类中使用静态方法是一种解决方法,因为这些语言没有自由函数(即,函数直接驻留在名称空间中,而不是作为类的一部分)。 C ++没有这个缺陷。只需使用名称空间。
回答
静态函数的问题在于它们可能导致破坏封装的设计。例如,如果我们发现自己正在编写类似以下内容的内容:
public class TotalManager { public double getTotal(Hamburger burger) { return burger.getPrice() + burget.getTax(); } }
...那么我们可能需要重新考虑设计。静态函数通常要求我们使用setter和getter,它们会使类的API变得混乱,并且通常会使事情变得更复杂。在我的示例中,最好删除Hamburger的getter,然后将getTotal()类移到Hamburger本身中。
回答
使用名称空间收集功能:
namespace Console { void WriteLine(...) // ... }
至于内存,函数在函数外部,静态成员函数或者命名空间中使用的内存量相同。那就是:除了代码本身之外没有其他存储器。
回答
对于组织,请使用已经说明的名称空间。
对于全局数据,我喜欢使用单例模式,因为它有助于解决静态对象的初始化顺序未知的问题。换句话说,如果将对象用作单例对象,则确保在使用该对象时对其进行初始化。
另外,请确保静态函数是无状态的,以便它们是线程安全的。
回答
我通常只将静态函数与好友系统结合使用。
例如,我有一个类,该类使用很多(内联的)内部帮助器函数来计算内容,包括对私有数据的操作。
当然,这增加了类接口具有的功能数量。
为了摆脱这一点,我在原始类.cpp文件中声明了一个辅助类(因此对外界不可见),使其成为原始类的朋友,然后将旧的辅助函数移动到静态(内联)成员helper类的函数,除旧参数外,还按引用传递旧类。
这样可以保持界面苗条,并且不需要大量的免费好友功能列表。
内联也很好用,所以我并不完全反对静态。
(我尽量避免使用它,但是我喜欢这样做。)