2008-08-27 26 views
11

我喜欢在C++中使用静态函数来对它们进行分类,就像C#一样。正在使用太多的静态坏的或好的?

Console::WriteLine("hello") 

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

static const

什么?

+0

不能使用命名空间吗? – 2009-06-03 16:51:59

回答

24

但它是好还是坏

想到的是“不必要的”第一个形容词。 C++有免费的函数和命名空间,那么为什么你需要在一个类中使它们成为静态函数呢?

使用的C#和Java 在不可实例类的静态方法是一种变通方法因为这些语言没有免费的功能(即直接在命名空间驻留功能,而不是作为一个阶级的一部分) 。 C++没有这个缺陷。只需使用一个名称空间。

+0

我同意。 +1。可以使用“静态”方法,但是我无法提供一个,或者在所有帖子中找到一个,但名称空间未包含它。去NAMESPACES。 :-) – paercebal 2008-09-18 08:22:25

10

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

但是,时刻这些函数需要某种外部(非编译时常量)数据,那么应该将该函数作为一个实例方法,并将其与其数据一起封装到一个类中。

一言以蔽之:静态函数确定,静态数据坏。

1

同意弗兰克在这里,有没有用静态的(全局)的功能(当然前提是它们被组织)..一个问题的问题,只有开始,当人们想到“哦,我只会让这个范围确实蠕变数据更宽一点” ..滑坡:)

说得真成的角度.. Functional Programming位;)

1

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

1

我倾向于做出包括静态函数的类,但也有人说“正确的方法”做这通常是使用命名空间来代替。 (在C++有命名空间之前,我发展了自己的习惯。)

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

1

问题与静态函数是,他们可能会导致在突破封装设计。例如,如果您发现自己写的东西类似于:

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

...那么您可能需要重新考虑您的设计。静态函数通常要求你使用setter和getter,这些setter和getter会混淆一个Class的API,并且通常会使事情更加复杂。在我的例子中,最好移除汉堡的getter,然后把getTotal()类移入Hamburger本身。

2

使用命名空间,使函数的集合:

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

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

0

对于组织,请按照前面所述使用名称空间。

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

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

0

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

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

这当然会增加类接口的功能数量。 为了解决这个问题,我在原始类的.cpp文件中声明了一个助手类(从而看不到外部世界),使它成为原始类的朋友,然后将旧的助手函数移动到静态(内联)除了旧参数之外,还为每个引用传递旧类。

这使得界面纤细,并且不需要很大的免费好友功能列表。内联也很好地工作,所以我不完全反对静态。 (我避开它,就像我可以,但使用它这个样子,我喜欢做的事。)

3

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

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

    private: 
    static void f2() {} 
}; 

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

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

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

相关问题