【问题标题】:C++ public variable scope confusion [closed]C ++公共变量范围混淆[关闭]
【发布时间】:2017-11-03 04:36:15
【问题描述】:

如果您在一个类中声明了一个公共变量,那么您可以从任何也是该类成员的函数中修改该变量。

如果你在函数中声明一个变量,那么它的作用域不会超出函数的范围。

那么公共类变量本质上是一个可以被类的任何成员访问和更改的全局变量吗?

如果是这样,全局变量和公共变量有什么区别?

【问题讨论】:

  • 全局变量在任何地方都可以访问,无论如何。公共变量只能通过您的类的实例访问。
  • @FrenchMajesty “全局变量在任何地方都可以访问,无论如何”只有当它们被外部访问时,否则它们被限制在它们的文件范围内。
  • @George:好吧,编译器不知道这一点,所以它必须将任何非静态文件范围变量视为全局变量。

标签: c++ scope global-variables difference public-members


【解决方案1】:

您缺少的更重要的语义是类成员变量(除非它是static)特定于该类的每个实例。例如

class Foo
{
public:
    Foo() = default;
    int x;
};

如果我说

Foo a{};
Foo b{};

a.x = 1;
b.x = 7;

a.x != b.x;   // value is different
&a.x != &b.x  // address is different

注意成员变量x有不同的值,有不同的地址(因为它是一个完全不同的int),并且属于Foo的每个实例。

现在提到static,请注意我不能这样做

Foo::x = 5;   // only works if x is static

因为我需要一个Foo 的实际实例 来访问其成员变量。相反,static 成员不需要实例,并且整个类都有该成员的一个共享实例。

【讨论】:

    【解决方案2】:

    如果您在一个类中声明了一个公共变量,那么您可以从任何同时也是该类成员的函数中修改该变量。

    不完全是:同样适用于私有变量和受保护变量。也就是说,如果一个类有3个变量,其中一个是public,一个是protected,一个是private,那么该类的成员函数不能只修改公共的;相反,他们可以修改所有 3. 作为同一类的成员,您可以获得最高权限。当试图从该类外部操作这些变量时,可以看到这 3 个访问修饰符之间的区别:公共变量可以从任何地方访问,受保护的变量可以从同一个类以及从它派生的类访问(如果有的话),私有的只能从同一类的其他成员访问。

    如果你在函数中声明一个变量,那么它的作用域不会超出函数的范围。

    是的,这实际上适用于任何块:如果您在for 循环内声明一个变量,它的范围将是循环。函数只是一种块。

    那么公共类变量本质上是一个可以被类的任何成员访问和更改的全局变量吗?

    不,正如我上面所说,公共类变量可以被 any 类的成员访问,甚至可以从根本不属于任何类的东西访问:这正是“公开”。

    如果是这样,全局变量和公共变量有什么区别?

    正如 CoryKramer 在his answer 中所说,类成员存在于对象内部,并且对象彼此独立,因此如果您创建同一个类的 10 个对象,则所有 10 个对象都将拥有该变量的自己的副本。 static 类成员是一个例外,因为它们被类的所有对象共享,实际上甚至不需要单个对象存在(您熟悉Singleton 的概念吗?没有静态成员它不会工作)。

    一个实际的区别:假设您想将文件名存储在您的所有函数都可以轻松访问的位置。一个全球性的会做。相反,类的公共成员要求您首先创建该类的对象,然后该对象必须在范围内!如果您在main() 中创建对象,然后您想从名为write_results_to_file() 的函数中读取该变量,以便知道要写入哪个文件,则必须注意将对象传递给该函数,否则对象将超出范围,并且公共成员将无法访问,尽管是公共的。

    所以全局变量更方便,因为它们需要的工作更少。这正是人们喜欢使用它们的原因,但请注意,这种懒惰会带来糟糕的代码:如果使用全局变量,编写代码会更容易,但很难理解每个函数是如何工作的。理想情况下,一个函数只需要它的参数,然后它就可以运行并产生结果。在 C++ 中,您通常可以通过查看 .hh 文件中的声明来查看函数的参数。但是如果该函数访问一个全局变量,我们可以说该函数使用了一个“隐藏”参数,其中“隐藏”意味着它不显示在其声明中。一旦程序增长到不平凡的规模,这实际上会使事情变得更加困难,因为很难理解更改的后果。例如,如果程序修改了一个全局变量,那么所有使用该变量的函数都会受到影响,但在某些情况下根本不明显,这会导致难以发现的细微错误。再举一个例子,测试一个函数会变得更加困难:如果你编写了一些测试用例,你会期望无论何时运行它们都会得到相同的结果,只要你传递的参数是相同的。相反,结果将取决于参数(这很清楚)以及全局变量的值(这并不明显)。

    这就是为什么全局变量不受欢迎的原因:因为它们使编写代码变得容易和快速,但理解和维护它(添加新功能或修复错误)却很难且缓慢。不禁止使用它们,但您应该小心谨慎地使用它们。

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多