2011-10-01 88 views
3

我有一堆函数,我想放在一个单独的命名空间或类。在两个之中,哪个更好?如果是后者,我应该怎么做呢?我的意思是,我没有任何实例成员,所以我应该指定构造函数为private?或删除它?C++静态类

无论哪种方式,它会是这个样子,给你一个想法:

myproject::foo::f() 

回答

11

C++的命名空间和类可以同时包含的功能和其他类型的,但也有一些行为的关键区别。你必须决定哪个最适合你的特殊情况。

  • 类可以模板化,名称空间不能。这提供了将一组模板参数传递给一组函数和其他类型的方法。结合typedef,这可以非常强大。

  • 您可以使用using namespace xyz;将一组名称空间成员放入任何范围。类可以被继承以使它们进入范围(如果没有实例成员,由于空的基本优化,但静态成员可以在没有限定的情况下使用,效果不会太大),但这只适用于其他类。免费功能必须明确限定对班级成员的所有访问权限。

  • 命名空间参与参数相关的查找,父类的成员不参与。

如果你想使用继承一个类来提供模板参数,并获得其静态成员不合格访问的伎俩,那么你就应该离开的构造函数和析构函数的默认和琐碎,而不是删除或使他们无法访问。在C++ 11中,您可以将构造函数标记为protected和defaulted。

+0

+1对于这个看似简单的问题的这个令人惊讶的深度答案 –

+0

@KerrekSB:这些想法中的很多都是在C#中为静态使用构造游说时开发的。 –

+0

谢谢。我不需要任何使用类的优点,所以我只是使用一个名称空间。 – someguy

1

如果使用该类,最好声明默认构造函数,复制构造函数,赋值运算符和析构函数的私有/未实现(可能还有一些C++ 11)。如果你没有,你会有一个可以用来制造无用物体的类。如果您使用命名空间,则不必执行任何操作。

类是为物体制作的。使用它们作为静态函数的容器,没有成员数据,比滥用更多的是滥用。