这些变量的范围是什么?

时间:2011-07-01 18:23:46

标签: c++

请参阅下面的C ++代码片段:

#include .....

Class1 class1;
Class2 class2;
...

void Class3::foo() {
    ...
}

有哪些变量:class1和class2?它们是全局变量吗?静态变量?实际上这些是什么?在C ++ OO编程中,使用这些是不错的做法,因为文件中任何类的任何成员函数都可以访问它们?

对不起初学者的问题。

感谢。

3 个答案:

答案 0 :(得分:8)

是的class1& class2是全局变量。

什么是全局变量?
在块外部声明的变量称为全局变量。全局变量具有程序范围,这意味着它们可以在程序中的任何位置访问,并且只有在程序结束时才会被销毁。

由于全局变量具有程序范围,因此可以跨多个文件使用它们。为了使用已在另一个文件中声明的全局变量,您必须使用前向声明或头文件以及extern关键字。 Extern告诉编译器您没有声明一个新变量,而是引用其他地方声明的变量。

在C ++ OO编程中,使用这些是不错的做法,因为文件中任何类的任何成员函数都可以访问它们?

通常,人们使用全局变量,因为:

  • 他们不了解C ++变量传递机制,或者他们是懒惰的。
  • 保存整个程序需要使用的数据(例如配置设置)。
  • 在没有调用者/被调用者关系的代码之间传递数据(例如,多线程程序)

但全局变量是邪恶的!!
为什么?
原因很简单,它们通过多种方式增加了程序的复杂性 很难跟踪修改的全局变量,因为它可以在任何多个文件中的任何位置进行修改。

在多线程程序中,多个线程可以竞争获取这些全局变量,因此应始终通过某种同步机制来保护这些全局变量。通常,除非您了解整个系统,否则很难理解并编写此类机制。

既然你问过,
什么是静态变量?
静态变量是由关键字static限定的变量。

静态变量与全局变量有何不同?
需要考虑的重要区别点是:

范围:
对象的范围是对象在被访问的位置是否可见(以其名称所知)。

静态变量是定义它们的块的本地变量,而整个程序中的任何文件都可以访问全局变量。

答案 1 :(得分:2)

这些是全局变量(在这种情况下是对象)。局部变量或对象将在方法,函数或类内部(基本上在封闭块内)声明,并且不能在其外部访问。通常,您不应该使用全局变量,因为正如您所说,同一范围内的任何内容都可以访问它们。但是,在某些情况下,您会发现您可能需要它们。虽然如果你真的必须以这种方式将变量传递给很多函数,你可能最好通过引用传递它。

答案 2 :(得分:0)

class1class2是全局变量。这是好习惯吗?可能不是;你不能依赖翻译单位中这些变量的初始化顺序。

您可以使用以下习语获得可靠的订单:

inline Class1& getClass1() {
  static Class1 object;
  return object;
}

使用此功能,您可以确切地知道Class1对象何时初始化(就在您需要它之前)。