请参阅下面的C ++代码片段:
#include .....
Class1 class1;
Class2 class2;
...
void Class3::foo() {
...
}
有哪些变量:class1和class2?它们是全局变量吗?静态变量?实际上这些是什么?在C ++ OO编程中,使用这些是不错的做法,因为文件中任何类的任何成员函数都可以访问它们?
对不起初学者的问题。
感谢。
答案 0 :(得分:8)
是的class1& class2是全局变量。
什么是全局变量?
在块外部声明的变量称为全局变量。全局变量具有程序范围,这意味着它们可以在程序中的任何位置访问,并且只有在程序结束时才会被销毁。
由于全局变量具有程序范围,因此可以跨多个文件使用它们。为了使用已在另一个文件中声明的全局变量,您必须使用前向声明或头文件以及extern
关键字。 Extern告诉编译器您没有声明一个新变量,而是引用其他地方声明的变量。
在C ++ OO编程中,使用这些是不错的做法,因为文件中任何类的任何成员函数都可以访问它们?
通常,人们使用全局变量,因为:
但全局变量是邪恶的!!
为什么?的
原因很简单,它们通过多种方式增加了程序的复杂性
很难跟踪修改的全局变量,因为它可以在任何多个文件中的任何位置进行修改。
在多线程程序中,多个线程可以竞争获取这些全局变量,因此应始终通过某种同步机制来保护这些全局变量。通常,除非您了解整个系统,否则很难理解并编写此类机制。
既然你问过,
什么是静态变量?
静态变量是由关键字static
限定的变量。
静态变量与全局变量有何不同?
需要考虑的重要区别点是:
的范围:强>
对象的范围是对象在被访问的位置是否可见(以其名称所知)。
静态变量是定义它们的块的本地变量,而整个程序中的任何文件都可以访问全局变量。
答案 1 :(得分:2)
这些是全局变量(在这种情况下是对象)。局部变量或对象将在方法,函数或类内部(基本上在封闭块内)声明,并且不能在其外部访问。通常,您不应该使用全局变量,因为正如您所说,同一范围内的任何内容都可以访问它们。但是,在某些情况下,您会发现您可能需要它们。虽然如果你真的必须以这种方式将变量传递给很多函数,你可能最好通过引用传递它。
答案 2 :(得分:0)
class1
和class2
是全局变量。这是好习惯吗?可能不是;你不能依赖翻译单位中这些变量的初始化顺序。
您可以使用以下习语获得可靠的订单:
inline Class1& getClass1() {
static Class1 object;
return object;
}
使用此功能,您可以确切地知道Class1
对象何时初始化(就在您需要它之前)。