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

Declaring a Global Class Instance in a C++ file

本文关键字:全局 实例 声明 C++ 文件      更新时间:2023-10-16

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

Class b(constructor parameters)

它不会引起问题。我的理解是,以这种方式声明类会将它们分配给它们所在的方法的堆栈帧中,而不是堆上。但是如果我全局声明这一点,则没有方法,因此没有堆栈框架,对吗?为什么允许我这样做,更重要的是正在发生的事情,这在C++中有什么大禁忌吗?

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

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

通常,人们不会建议从设计角度依赖全局变量。 不过,这取决于,它们可能是合理的。

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

如果变量未在文件外部引用,或者出于横切问题,那么有时这可能是一件好事。

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

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

除了在调用之前初始化

所有此类全局对象main()并且初始化不会引入数据争用之外,通常不指定初始化顺序。

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

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

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

快速注释

您可能需要将帖子标题更改为:

在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();

干杯。