创建一个所有成员(属性,函数)都是静态的类的(目标)缺点是什么?特别是与命名空间的使用相比?或者您更愿意创建全局变量/函数?
我喜欢创建静态属性,因为我发现它们“更整洁”。 (我确切地知道它们来自哪里等等)我对命名空间不是很熟悉。我对全局变量感到不舒服,因为我不熟悉extern
和static
等C关键字。
此外,如果我们考虑班级
class MyStaticClass
{
private:
static int x;
static double y;
public:
static float s;
static double weatherForecast(unsigned int, char);
};
和命名空间
namespace MyNamespace
{
int x;
double y;
float s;
double weatherForecast(unsigned int, char);
}
调用MyStaticClass::weatherForecast
和调用MyNamespace::weatherForecast
之间是否存在差异(性能方面)?
阅读/撰写MyStaticClass::s
和阅读/撰写MyNamespace::s
之间是否存在差异(表现方面)?
如果使用类而不是主要类型,上述问题的任何答案都会改变吗?
答案 0 :(得分:8)
是好的做法"创建一个所有成员(属性,函数)都是静态的类?
这被称为" monostate"这取决于。
或者您更愿意创建名称空间?
具有静态函数的类可以是模板参数,而命名空间则不能。另一方面,名称空间允许依赖于参数的查找,而类则不那么。
或者您更愿意创建全局变量/函数吗?
有些东西是真正的全局,比如标准流,Logger对象,事件循环引擎(特定于线程的全局)。例如,在每次调用中传递Logger对象或将它们存储为成员变量的代码比IMO更复杂。
有一个经常被引用的误解,即翻译单元的动态初始化顺序是未定义的,所以人们过度使用单例而不是普通的全局变量来确保Singleton对象在首次使用之前被初始化。但是,有一种称为Schwarz Counter的可移植技术,用于初始化标准流(std::cout
和朋友),这确保这些全局变量在第一次使用之前被初始化,甚至在main
之前进入了。
更新问题的答案:不,不,不。