我喜欢使用静态功能在C++以一种方式对它们进行分类,像C#。

Console::WriteLine("hello")

这是好事还是坏事?如果该职能是经常使用的,我猜这根本不重要,但如果不做他们把压力的记忆?

怎么样 static const?

有帮助吗?

解决方案

但这是好的或坏的

第一形容词是"不必要".C++已经自由的功能和名称空间,那么,为什么你需要让他们静态功能在一个类?

使用静态的方法,在uninstantiable类在C#和Java 是一个解决方法 因为这些语言没有免费的职能(即,职能,直接驻留在名字空间,而不是作为一部分的一类)。C++没有这样的缺陷。只是使用一个名称空间。

其他提示

我所有的使用静 功能.这些仅仅是有意义尤其当组成的模块(static class 在C#)。

但是, 的时刻 这些职能需要某种形式的外部(无编译时间常量)的数据,然后将这一职能应该由一个实例的方法和封沿用其数据进入一类。

一言以蔽之:静态功能"确定"、静态数据坏。

那些人说的静态功能可以被替换名称空间是错误的,这是一个简单的例子:

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

   private:
     static void f2 () {}
};

正如你可以看到,公共静态功能 f1 呼吁另一个静态的,而是私人的功能 f2.

这不仅是一个收藏的功能,但是一个聪明的收集与自己封装的方法。名字空间,不会给我们这个功能。

许多人使用的"单独"的模式,只是因为它是一种常见的做法,但在许多情况下你需要一级与几个静态的方法,并只是一个静态数据的部件。在这种情况下,没有必要单独在所有。还呼吁的方法 instance() 慢比仅仅访问静态功能/成员。

使用的名称空间使收集的功能:

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

作为对存储、功能使用相同的额外的功能,作为一个静态部件的功能或者在一个名字空间。这是:没有记忆他的代码本身。

一个具体原因的静态数据是坏的,是用C++不保证关于初始化了静的对象,在不同的翻译单位。在实践中这可能导致的问题,当一个物体上取决于另一个在一个不同的翻译单位。斯科特*梅尔讨论了这一项目26的他的书更有效C++。

同意弗兰克在这里,没有一个问题静态的(全球)的职能(当然为他们组织)..该问题只是开始真正爬在当人们觉得"噢我只是让的范围上的这个位数据的一个小小的更广泛的"..滑坡:)

把它真的到透.. 编程功能 ;)

问题的静态功能的是,它们可以导致设计,打破封装。例如,如果你发现自己写的东西,如:

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

...然后你可能需要重新考虑你的设计。静态功能往往需要你使用者以及干将其混乱一类的API和使事情更加复杂。在我的实例,它可能是更好的去除汉堡的吸气,只是移动getTotal()类成汉堡本身。

我倾向于使课程,包括静态功能,但有些人说的"正确的方式"来做到这一点是通常使用的名字空间,而不是。(I发达我的习惯之前,C++已命名空间。)

顺便说一句,如果您有一类中只包含静态数据和功能,你应该宣布的构造是私有的,因此没有人试图实例。(这是其中一个原因,一些人认为使用名称空间,而不是课程。)

为组织使用的名称空间正如已经说明。

全球数据我喜欢用 单独 模式,因为它有助于该问题的未知的初始化了静的对象。换句话说,如果你使用对象为单一实例的是保证被初始化时,其使用。

还要确保你的静态功能的无国籍,使他们的线的安全。

我通常仅使用静态结合的朋友系统。

例如,我有一个类使用了大量的(内联)内部的辅助功能计算出的东西,包括操作上的私人数据。

当然,这增加了些功能的类界面。摆脱,我宣布一个助手类在原来的课程。cpp文件(并因此而看不见外面的世界),使它成为一个朋友的原类,然后将旧的辅助职能成静态(在线)的成员职能的帮助类,通过古老的类每个参考除旧的参数。

这保留的接口薄,并不需要一个大的自由的朋友的功能。内联还工作得很好,所以我没有完全反对静态的。(I避免它,就像我可以,但使用这样的,我喜欢做的事。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top