如果您在一个类中声明了一个公共变量,那么您可以从任何同时也是该类成员的函数中修改该变量。
不完全是:同样适用于私有变量和受保护变量。也就是说,如果一个类有3个变量,其中一个是public,一个是protected,一个是private,那么该类的成员函数不能只修改公共的;相反,他们可以修改所有 3. 作为同一类的成员,您可以获得最高权限。当试图从该类外部操作这些变量时,可以看到这 3 个访问修饰符之间的区别:公共变量可以从任何地方访问,受保护的变量可以从同一个类以及从它派生的类访问(如果有的话),私有的只能从同一类的其他成员访问。
如果你在函数中声明一个变量,那么它的作用域不会超出函数的范围。
是的,这实际上适用于任何块:如果您在for 循环内声明一个变量,它的范围将是循环。函数只是一种块。
那么公共类变量本质上是一个可以被类的任何成员访问和更改的全局变量吗?
不,正如我上面所说,公共类变量可以被 any 类的成员访问,甚至可以从根本不属于任何类的东西访问:这正是“公开”。
如果是这样,全局变量和公共变量有什么区别?
正如 CoryKramer 在his answer 中所说,类成员存在于对象内部,并且对象彼此独立,因此如果您创建同一个类的 10 个对象,则所有 10 个对象都将拥有该变量的自己的副本。 static 类成员是一个例外,因为它们被类的所有对象共享,实际上甚至不需要单个对象存在(您熟悉Singleton 的概念吗?没有静态成员它不会工作)。
一个实际的区别:假设您想将文件名存储在您的所有函数都可以轻松访问的位置。一个全球性的会做。相反,类的公共成员要求您首先创建该类的对象,然后该对象必须在范围内!如果您在main() 中创建对象,然后您想从名为write_results_to_file() 的函数中读取该变量,以便知道要写入哪个文件,则必须注意将对象传递给该函数,否则对象将超出范围,并且公共成员将无法访问,尽管是公共的。
所以全局变量更方便,因为它们需要的工作更少。这正是人们喜欢使用它们的原因,但请注意,这种懒惰会带来糟糕的代码:如果使用全局变量,编写代码会更容易,但很难理解每个函数是如何工作的。理想情况下,一个函数只需要它的参数,然后它就可以运行并产生结果。在 C++ 中,您通常可以通过查看 .hh 文件中的声明来查看函数的参数。但是如果该函数访问一个全局变量,我们可以说该函数使用了一个“隐藏”参数,其中“隐藏”意味着它不显示在其声明中。一旦程序增长到不平凡的规模,这实际上会使事情变得更加困难,因为很难理解更改的后果。例如,如果程序修改了一个全局变量,那么所有使用该变量的函数都会受到影响,但在某些情况下根本不明显,这会导致难以发现的细微错误。再举一个例子,测试一个函数会变得更加困难:如果你编写了一些测试用例,你会期望无论何时运行它们都会得到相同的结果,只要你传递的参数是相同的。相反,结果将取决于参数(这很清楚)以及全局变量的值(这并不明显)。
这就是为什么全局变量不受欢迎的原因:因为它们使编写代码变得容易和快速,但理解和维护它(添加新功能或修复错误)却很难且缓慢。不禁止使用它们,但您应该小心谨慎地使用它们。