c ++中对全局对象的需求是什么?

时间:2014-10-19 17:27:33

标签: c++ global-object

我知道C ++还允许创建类和结构的全局对象。

#include <iostream>
using std::cout;
class Test
{
    public:
        void fun()
        {
            cout<<"a= "<<a;
        }
    private:
        int a=9;
};
Test t;  // global object
int main()
{
    t.fun();
    return 0;
}

何时&amp;我应该在哪里使用全局对象?全局对象是否有特定用途?请帮帮我。

4 个答案:

答案 0 :(得分:6)

简短的回答是没有必要


答案很长,有时候方便。不幸的是,方便是主观的,而另一个人认为方便的另一方可能会觉得太宽松。

全局对象存在问题(其中混乱的数据流入代码和访问同步),但有时可能会发现使用一个因为它使更容易更方便。它确实可以保持更容易,或者它可以证明是一种维护负担,但只有未来才能说明......

...如果你可以避免全局物体,一般来说你应该更好。但实际上,在编程大规模之前,您很少会遇到问题;用于玩具示例和学生的#39;项目很少有问题,这就是为什么初学者不理解为什么更多经验丰富的开发人员会像瘟疫一样避开它们。

答案 1 :(得分:0)

在一个复杂的项目中,你不应该这样做。如果您计划在其他项目中使用它,那么您应该始终位于命名空间内。

范围很广的一个例子是运算符重载或您定义的将多次使用的接口。

良好做法......组织您的项目以使用描述性和直观的命名空间。

全局实际上只在简单的项目中有用,简单的不使用命名空间。

答案 2 :(得分:0)

问题是反对的:need ifwiledo,因为我们可以只用for完成所有工作吗?

技术答案是“不,没有必要:事实我们可以做到而不证明它”。但更实用的一点表明,将每个控制流量减少到一个关键工作中会使代码更难跟踪和跟踪。所以它在技术上是可行的,但并不总是方便。

现在:我们可以不使用全局对象吗?

第一个非答案是“是的,有单身人士”。但是单例是通过函数获得的静态对象。如果不是因为设计缺陷(称为“static initialization order fiasco”),它们

链接的可执行Singleton允许绕过这个问题,但实质上是允许全局“事物”存在的解决方法。

这种缺陷(和单身技术)的存在使许多“老师”得出一些“道德”劝说,如“永远不会使用全球物品,或者地狱的火焰会燃烧你的屁股”。但很快就会std::cout << "hello world"并立即放弃所有可信度。

关键是没有“全局”,一切都是“范围本地”,而且C ++中没有“动态范围”:如果funcA调用funcBfuncB则看不到{{} 1}} locals,因此跨范围访问事物的唯一方法是参数传递引用或指针。

在大多数“功能性”的上下文中,“动态范围”的缺失由“lamba捕获”补偿,其他所有内容都将作为参数。

在大多数“程序性”的上下文中,需要一个能够在进出范围内存活并且可以在进出时修改的“状态”更适合全局对象。这就是funcA的原因。它表示一个资源,它存在并存在于程序之后,其状态在各种调用中演变。如果没有全局方式来访问cout,它应该在cout中初始化,作为参考参数传递给任何函数调用:甚至是没有输出的函数,因为它们可能会调用他们自己的东西,有输出给。

实际上,您可以将全局对象视为“传递给每个函数的隐式参数”。

你可以在全局函数中进行扭曲但是-if函数本身可以是对象,而对象本身可以是函数 - 为什么说全局对象是坏的并且全局函数可能是正确的?

事实上,实际的唯一原因是static initialization order fiasco

答案 3 :(得分:-1)

我会说需要全局变量才能向后兼容c。这是肯定的,这是我看到的唯一困难的原因。由于类和结构基本相同,所以在禁止只有一个方面它可能没什么意义。

我不知道任何普遍认为是良好做法的模式或用例,它们会利用全局对象。通常,如果没有正确地与之交互,全局对象迟早会导致混乱。它们隐藏了数据流和关系。它很容易绊倒它。

尽管如此,我还是看到一些库将一些对象暴露为全局变量。通常包含一些静态数据的东西。但也有其他案例,值得注意的例子是标准图书馆的std::cout和家庭。

我不会判断它的好坏方法。这是太主观的IMO。你可以使用单身人士,但有人可能会说,你可以根据合同等处理全球对象等。