使用太多的静电是好还是坏?

时间:2020-03-05 18:44:03  来源:igfitidea点击:

我喜欢在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类的函数,除旧参数外,还按引用传递旧类。

这样可以保持界面苗条,并且不需要大量的免费好友功能列表。
内联也很好用,所以我并不完全反对静态。
(我尽量避免使用它,但是我喜欢这样做。)