这些变量的范围是什么
What is the scope of these variables?
请参阅下面的C++代码片段:
#include .....
Class1 class1;
Class2 class2;
...
void Class3::foo() {
...
}
变量是什么:类1和类2?它们是全局变量吗?静态变量?这些到底是什么?在C++OO编程中,因为文件中任何类的任何成员函数都可以访问它们,所以使用这些是否是一种好的做法?
抱歉回答初学者的问题。
谢谢。
Yes class1&类2是全局变量。
什么是全局变量
在块外部声明的变量称为全局变量。全局变量具有程序范围,这意味着它们可以在程序中的任何地方访问,并且只有在程序结束时才会被销毁。
因为全局变量具有程序作用域,所以它们可以跨多个文件使用。为了使用在另一个文件中声明的全局变量,必须使用前向声明或头文件以及extern
关键字。Extern告诉编译器,您不是在声明一个新变量,而是引用在其他地方声明的变量。
在C++OO编程中,由于文件中任何类的任何成员函数都可以访问这些函数,因此使用这些函数是否是一种好的做法
通常,人们使用全局变量是因为:
- 他们不了解C++变量传递机制,或者他们很懒惰
- 保存整个程序需要使用的数据(例如配置设置(
- 在没有调用者/被调用者关系的代码之间传递数据(例如,多线程程序(
但是全局变量是邪恶的
为什么
原因很简单,它们将程序的复杂性增加了数倍
很难跟踪被修改的全局变量,因为它可以在多个文件中的任何位置进行修改。
在多线程程序中,多个线程可以竞相获取这些全局变量,因此这些全局变量应该始终通过某种同步机制得到保护。通常,除非您了解整个系统,否则很难理解和编写这样的机制。
既然你问了,
什么是静态变量
静态变量是将由关键字static
限定的变量。
静态变量与全局变量有何不同
需要考虑的一个重要区别点:
作用域:
对象的作用域是对象在被访问的位置是否可见(通过其名称已知(。。
静态变量是定义它们的块的本地变量,而全局变量可以在程序的任何文件中访问。
这些是全局变量(本例中为对象(。局部变量或对象将在方法、函数或类内部声明(基本上在封闭块内部(,并且在外部无法访问。通常,您不应该使用全局变量,因为正如您所说,同一范围内的任何对象都可以访问它们。然而,在某些情况下,你会发现你可能需要它们。尽管如果你真的必须以这种方式将一个变量传递给很多函数,那么你最好只是通过引用来传递它。
class1
和class2
是全局变量。这是好的做法吗?可能不会;您不能依赖于这些变量在翻译单位之间的初始化顺序。
您可以使用以下习惯用法获得可靠的订单:
inline Class1& getClass1() {
static Class1 object;
return object;
}
使用它,您可以准确地知道Class1
对象何时初始化(就在您需要它之前(。
- 我不知道这条线是做什么的
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 这个构造函数是做什么的
- 叮叮当当的'range-loop-analysis'诊断是关于什么的?
- 为什么这个循环变量在循环范围之外是可访问的
- qt c++ 中的这句话是做什么的
- 这是做什么的?C++
- "+="操作员究竟是做什么的?
- 运算符重载中变量的数据类型和范围应该是什么
- C 运算符在参考vars上,这是做什么的
- gen~ phasor() 是做什么的?(将 Max/MSP gen 转换为 C++)
- 统一实际分布的范围限制是多少
- 'auto f(params) -> decltype(..., void())' 中的 'void()' 是做什么的?
- 除了内存管理,QObject的父级是做什么用的?
- Xor -> 和 -> Xor 是做什么的?
- 这是做什么的?C++
- const 类 * const Function() 第二个 const 是做什么的
- 在C++中实现随机预言机(输出在范围内是随机的,但对于相同的输入输出是相同的)
- "using namespace"到底是做什么的?
- 在C++11中,用什么方法对数组进行简单的范围管理是最干净的