虽然我对C ++的工作方式有很好的理解,但我对它的一部分使用感到困惑。如果我在.cpp文件中全局声明一个类实例(不与类相关),如
Class b(constructor parameters)
它不会导致问题。我的理解是,以这种方式声明类在堆栈框架中为它们所在的方法而不是在堆上分配它们。但是,如果我在全局声明这个没有方法,因此没有堆栈帧吗?为什么我被允许这样做,更重要的是发生了什么事情,这在C ++中是否有任何大的不可以?
答案 0 :(得分:4)
它只是一个静态对象。它被视为任何其他全局变量。
它不会绑定到任何堆栈帧,并且会在第一次加载文件中的任何内容时创建。
通常,人们会不建议从设计角度依赖全局变量。但这取决于它们是否合理。
如果您正在进行任何类型的线程,则可能是一个问题。您还希望最小化应用程序的不同部分知道事物是全局变量,它会导致很多意大利面条代码。
如果变量未在文件外部引用,或者cross-cutting concerns引用,则有时它可能是一件好事。
最好的建议是尽可能避免使用,当你不能的时候不要over design it。
答案 1 :(得分:1)
作为全局变量的对象(或者更确切地说是“在命名空间范围内的变量”)具有静态存储持续时间。这意味着它们一直存在到程序结束之前,它们在程序启动期间初始化(在静态或动态初始化阶段)。
除了在调用main()
之前初始化所有这样的全局对象,并且初始化不引入数据争用时,通常不会指定初始化顺序。
(对相互依赖的全局初始化进行排序的常用技术是用全局getter函数和块静态变量替换裸全局变量:
Foo & getFoo() { static Foo impl; return impl; }
现在,在 getFoo()
之后,在其自己的构造函数中使用impl
的任何其他全局将被初始化。)
答案 2 :(得分: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();
干杯。