2016-01-12 51 views
2

创建一个所有成员(属性,函数)都是静态类的(客观)缺点是什么?特别是与使用命名空间相比?或者你更愿意创建全局变量/函数?现代C++中的全局变量

我喜欢创建静态属性,因为我发现它们“更整洁”。 (我确切地知道他们来自哪里,等等)。我对命名空间不是很熟悉。而且我对全局变量不满意,因为我对C关键字不是很熟悉,如externstatic

此外,如果我们考虑类

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); 
} 
  1. 是否有打电话MyStaticClass::weatherForecast并呼吁MyNamespace::weatherForecast之间的差异(性能明智)?

  2. 阅读/书写MyStaticClass::s与阅读/书写MyNamespace::s之间是否存在差异(表现方面)?

  3. 如果使用类而不是主类型,上述问题的答案是否会发生变化?

+3

_“或者你愿意创建一个命名空间吗?”_我认为这是今天公认的最佳做法。但这可能只是一个意见。 –

+2

你为什么需要它们?一组常量? + https://isocpp.org/wiki/faq/coding-standards#global-vars –

+0

https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables,这可能是有用的。 – 88877

回答

8

它是“良好做法”创建一个类,所有成员(属性,方法)是静态的?

这被称为“monostate”,它取决于。

或者你更愿意创建一个名称空间?

具有静态函数的类可以是模板参数,而命名空间不能。另一方面,名称空间允许依赖于参数的查找,而类 - 不太如此。

或者你愿意创建全局变量/函数吗?

有些事情是真正的全局性的,就像标准流,Logger对象,事件循环引擎(线程特定的全局)。例如,在每次调用中传递Logger对象或将它们存储为成员变量的代码比IMO所需的要复杂得多。

有一个经常被人引用的误解,认为翻译单元的动态初始化顺序是不确定的,所以人们过度使用单例而不是普通的全局变量来确保Singleton对象在第一次使用之前被初始化。但是,有一种称为Schwarz Counter的便携式技术,用于初始化标准流(std::cout和朋友),它确保在输入main之前首次使用这些全局变量。


回答您的更新问题:不,不,不。

+1

特别满意syngleton的揭穿。 – SergeyA

+0

你好,谢谢你的回答。我更新了原文,并列出了更多精确的问题。 @MSalters – Pippin

+0

我最近读到,实际上,在某些情况下,施瓦茨计数器是一种皱眉般的技术。例如,在LLVM项目编码标准http://llvm.org/docs/CodingStandards.html中,他们写道:“禁止在库文件中使用#include ,因为许多常见实现在每个翻译中都透明地注入静态构造函数包括它的单位。“问题是,对于链接到llvm的每个程序,所有这些静态init都会导致可衡量的和不必要的程序启动成本。 –