这些变量的范围是什么

What is the scope of these variables?

本文关键字:范围是 是什么 范围 变量      更新时间:2023-10-16

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

#include .....
Class1 class1;
Class2 class2;
...
void Class3::foo() {
    ...
}

变量是什么:类1和类2?它们是全局变量吗?静态变量?这些到底是什么?在C++OO编程中,因为文件中任何类的任何成员函数都可以访问它们,所以使用这些是否是一种好的做法?

抱歉回答初学者的问题。

谢谢。

Yes class1&类2是全局变量。

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

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

在C++OO编程中,由于文件中任何类的任何成员函数都可以访问这些函数,因此使用这些函数是否是一种好的做法

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

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

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

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

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

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

作用域:
对象的作用域是对象在被访问的位置是否可见(通过其名称已知(。。

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

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

class1class2是全局变量。这是好的做法吗?可能不会;您不能依赖于这些变量在翻译单位之间的初始化顺序。

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

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

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