1

我虽然对 C++ 的工作原理有很好的理解,但我对它的一部分使用感到困惑。如果我在 .cpp 文件(不与类关联)中全局声明一个类实例,例如

Class b(constructor parameters)

它不会引起问题。我的理解是,以这种方式声明类在堆栈框架中为它们所在的方法分配它们,而不是在堆上。但是,如果我在全局范围内声明它,就没有方法,因此也没有堆栈框架,对吗?为什么允许我这样做,更重要的是正在发生什么,这在 C++ 中是不是有什么大不了的?

4

3 回答 3

3

它只是一个静态对象。它被视为任何其他全局变量。

它不会绑定到任何堆栈帧,并且会在第一次加载文件中的任何内容时创建。

一般来说,从设计的角度来看,人们不会推荐依赖全局变量。不过,这取决于,它们可能是合理的。

如果你正在做任何类型的线程,他们可能是一个问题。您还想最小化应用程序的不同部分,因为知道事物是全局变量,这会导致大量意大利面条式代码。

如果变量没有在文件之外被引用,或者是为了横切关注点,那么有时它可能是一件好事。

最好的建议是尽可能避免它,当你不能时不要过度设计它

于 2012-06-17T21:28:13.797 回答
1

作为全局变量的对象(或更准确地说是“在命名空间范围内”的变量)具有静态存储持续时间。这意味着它们一直存在到程序结束,并且它们在程序启动期间被初始化(在静态或动态初始化阶段)。

初始化的顺序一般没有规定,除了所有这样的全局对象在main()调用之前初始化,并且初始化不引入数据竞争。

(对相互依赖的全局初始化进行排序的常用技术是将裸全局变量替换为全局 getter 函数和块静态变量:

Foo & getFoo() { static Foo impl; return impl; }

现在,在其自己的构造函数中使用的任何其他全局getFoo()变量都将在之后 impl初始化。)

于 2012-06-17T22:37:44.893 回答
0

快速评论

您可能希望将帖子的标题更改为:

在 C++ 文件中声明全局类实例?

或者:

在 C++ 中,全局对象、它的声明以及之后如何存储在内存中?

我可能错了,但在我看来,就像您使用其他面向对象、编程语言、基于参考的工作一样,并尝试将您的经验应用于 C++。


例子

C++,它混合了:过程编程和面向对象编程,以及其他一些东西,比如函数式。

您可能希望将程序程序视为单个对象,该类已被声明并创建一个实例。并且,有这个公共main方法,自动执行,就像一个构造函数

当您读取这样的 C++ 文件时:

// file: "example.cpp"

// class declaration without local variables
class CoordinateClass
{
  int x;
  int y;
};

// a global variable
CoordinateClass MyCoordinates;

int main (char[][] args)
{
  // dont care about this in this example
  int ErrorCode = 0;

  // DoSomething();

  // dont care about this in this example
  return ErrorCode;
} // int main()

你可能想这样想:

// file: "example.cpp"

public: class example: program
{
  public:
    // class declaration without local variables
    class CoordinateClass
    {
      int x;
      int y;
    };

   // a global variable, works like a field of a class
   CoordinateClass MyCoordinates;

   int main (char[][] args)
   {
     // dont care about this in this example
     int ErrorCode = 0;

     // DoSomething();

     // dont care about this in this example
     return ErrorCode;
   } // int main()   

};

// this is done automatically:
example MyExample;
MyExample.main();

干杯。

于 2012-06-17T23:08:59.287 回答