在C++文件中声明全局类实例
Declaring a Global Class Instance in a C++ file
我虽然对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();
干杯。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何创建一个空的全局类并在启动时实例化它
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 类与命名空间的全局实例
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- 如何在C++中动态分配全局字符数组中的类实例?
- 如何强制调用类的全局实例的析构函数和构造函数(以便"re-init"类实例)
- 如何在C++中创建"全局"实例?
- 如何从函数中创建类的全局实例
- C++/Clr 中C++全局实例上的多线程
- 通过其他文件中的另一个全局变量使用类的全局实例
- C++-防止全局实例化
- 用c++对象的全局实例扩展嵌入式python解释器
- 为什么GCC将对全局实例构造函数的调用放在不同的部分(取决于目标)
- 在 MFC 中,为什么我需要创建 CWinApp 的全局实例
- 我可以有一个异常的静态全局实例吗?
- 类的多线程和全局实例
- 类的全局实例(跨多个文件)
- 为什么我不能将此全局实例化为指针
- 创建构造函数引用全局变量的类的全局实例时,C++ 程序崩溃