2017-08-14 101 views
0

我是新的C++,我不完全理解静态变量的概念。 我有一个类中的静态变量。类中的静态变量和内存分配及其使用

class FCCommunication : public OEMThread 
{ 
public: 
    FCCommunication(); 
    static bool MASTER; 
} 

我使用初始化我的代码和分配内存到FCCommunication源文件中以下两个语句

FCCommunication * FCObject = 0; 

FCObject = new FCCommunication(); 

现在我的问题是,如果我尝试访问MASTER变量会发生什么在这样完成对象和内存分配之前

if(FCCommunication::MASTER)// this gets called before dynamic memory allocation. 
{ 
//do something here. 
} 
+0

很多初学者的书籍和教程都将静态成员变量描述为*类成员变量*。这是因为它们属于*类*而不是该类的任何特定实例。这就是你需要分别定义静态成员变量的原因。这又意味着您可以在创建任何实例之前使用静态成员变量(或静态成员函数)。 –

+0

所以如果我把它叫做这个FCObject-> MASTER而不是FCC通信:: MASTER会有什么区别?它会破坏我的操作系统?考虑同样的分配情况。 – SPandya

+0

您在使用受保护模式操作系统的现代系统上所做的任何操作都不会影响操作系统。并且使用特定的实例来访问一个静态成员是不寻常的,但不是无效的。 –

回答

2

静态成员变量分配与静态存储时间任何其他非成员变量。这意味着它们最终会在程序启动之前初始化的大量数据中,通常称为.bss.data,具体取决于initalizer是否为零值。

因此,静态成员变量实际上并未与类一起分配,您初始化的值由在执行其余类之前执行的代码执行设置。

这意味着无论该类的任何实例是否存在,都可以实际访问静态成员。你可以把它们看作“具有受限访问和范围的全局变量”,因为这正是它们的原因。

这意味着你的代码很好。

+0

谢谢,这非常有帮助。现在又有人怀疑如果实例不在那里,并且变量非静态?会发生什么?我是否在请求内存泄漏? – SPandya

+0

@SPandya不确定你的意思。如果它不是静态的,你将无法通过'FCCommunication ::'访问它。 – Lundin

+0

我的意思是使用类对象。像FCObject-> MASTER,但实例没有遇到过。 – SPandya

0

(类的)C++成员静态变量属于该类的所有实例,在该类的任何实例被初始化之前初始化。因此,您可以使用FCC通信:: MASTER和FCObject-> MASTER访问那些没有差异的静态变量。

你应该小心的一件事是你必须分别定义这些静态变量。这就是说,你必须做这样的事情,外侧的类定义:

bool FCCommunications::MASTER = false; 
0

静态成员初始化时初始化为零的成员初始化为零... 换句话说,它们属于公共池。 任何其他对象都可以访问它。 范围内是类 生命期是程序的生命周期。