是使用太多静态坏还是好?

时间:2008-08-27 19:36:19

标签: c++ static

我喜欢在C ++中使用静态函数作为对它们进行分类的方法,比如C#。

Console::WriteLine("hello")

这是好还是坏?如果经常使用这些功能,我想这没关系,但如果没有,他们会对内存施加压力吗?

static const怎么样?

10 个答案:

答案 0 :(得分:26)

  

但是好还是坏

首先想到的形容词是“不必要的”。 C ++有自由函数和命名空间,那你为什么需要在类中创建静态函数呢?

在C#和Java 中的不可实例化类中使用静态方法是一种解决方法,因为这些语言没有自由函数(即直接驻留在命名空间中的函数,而不是作为一部分的函数一堂课)。 C ++没有那个缺陷。只需使用命名空间。

答案 1 :(得分:10)

我全都使用静态功能。这些只是在组织成模块(C#中的static class)时才有意义。

但是,那些那些函数需要某种外部(非编译时const)数据,那么该函数应该成为一个实例方法,并将其数据封装到一个类中。 / p>

简而言之:静态功能正常,静态数据不好。

答案 2 :(得分:3)

那些说静态函数可以被命名空间替换的人是错误的,这里有一个简单的例子:

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

如您所见,公共静态函数f1调用另一个静态但私有函数f2

这不仅仅是一个函数集合,而是一个具有自己的封装方法的智能集合。命名空间不会给我们这个功能。

许多人使用“单例”模式,仅仅因为它是一种常见的做法,但在许多情况下,您需要一个具有多个静态方法的类,而只需要一个静态数据成员。在这种情况下,根本不需要单身人士。同样调用方法instance()比直接访问静态函数/成员要慢。

答案 3 :(得分:2)

使用命名空间来创建函数集合:

namespace Console {
    void WriteLine(...) // ...
}

对于内存,函数在函数外部使用相同的量,作为静态成员函数或在命名空间中使用。那就是:代码本身没有其他内存。

答案 4 :(得分:1)

在这里同意弗兰克,静态(全局)功能没有问题(当然,只要它们有条理)......当人们想到“哦,我只会在这一点上做范围时,问题才真正开始蔓延”数据更广泛“..滑坡:)

把它真实地放到透视中.. Functional Programming;)

答案 5 :(得分:1)

静态数据不好的一个具体原因是C ++不保证不同翻译单元中静态对象的初始化顺序。实际上,当一个对象依赖于另一个对象在不同的​​翻译单元中时,这可能会导致问题Scott Meyers在他的“更有效的C ++”一书的第26项中对此进行了讨论。

答案 6 :(得分:1)

我倾向于创建由静态函数组成的类,但有些人说这样做的“正确方法”通常是使用命名空间。 (在C ++有命名空间之前,我养成了习惯。)

顺便说一下,如果你有一个只包含静态数据和函数的类,你应该将构造函数声明为私有,所以没有人试图实例化它。 (这是一些人争论使用命名空间而不是类的原因之一。)

答案 7 :(得分:1)

静态函数的问题在于它们可能导致破坏封装的设计。例如,如果您发现自己写的内容如下:

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

...那么您可能需要重新考虑您的设计。静态函数通常要求您使用setter和getter,这会使Class的API混乱并使事情变得更复杂。在我的例子中,最好删除Hamburger的getter并将getTotal()类移到Hamburger本身。

答案 8 :(得分:0)

对于组织,如前所述使用名称空间。

对于全局数据,我喜欢使用singleton模式,因为它有助于解决静态对象的未知初始化顺序问题。换句话说,如果您将对象用作单例,则保证在使用它时进行初始化。

还要确保您的静态函数是无状态的,以便它们是线程安全的。

答案 9 :(得分:0)

我通常只在朋友系统中使用静态。

例如,我有一个类,它使用大量(内联)内部帮助函数来计算内容,包括对私有数据的操作。

这当然会增加类接口的函数数量。 为了摆脱这种情况,我在原始类.cpp文件中声明了一个帮助器类(因此看不到外部世界),使其成为原始类的朋友,然后将旧的帮助器函数移动到静态(内联)成员中辅助类的函数,除了旧参数之外,还为每个引用传递旧类。

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