我虽然对 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();
干杯。