0

有这个代码:

#include <iostream>

const int c = 3;

struct A {
   static int f() { return c; }
   static const int c = 2;
};

int main() {
   std::cout << A::f() << std::endl; // 2
   return 0;
}

尽管首先声明了全局变量,但如何在函数中使用在类中定义c变量而不是在全局范围内定义的变量?Afcc

4

3 回答 3

3

首先声明哪个变量并不重要:如果一个类中有一个同名的变量,则该变量胜过全局变量。否则,只需声明一个名称为其中一个成员变量的全局变量,就会给现有代码带来很多麻烦!

当然,您的班级可以使用范围解析运算符c直接引用全局:

static int f() { return ::c; }

现在您的程序将打印3而不是2.

于 2013-05-03T15:33:31.103 回答
1

不是声明顺序的问题,而是变量范围的问题,使用的变量在当前方法/函数之前在类/结构和全局上下文中搜索,例如:

#include <iostream>

const int c = 3;

struct A {
   static void print() { 
      int c = 4
      std::cout <<"Method Scope:"<< c << std::endl; // 4
      std::cout <<"Class/Struct Scope:"<< A::c << std::endl; // 2 here you can use alse ::A::c
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
   static const int c = 2;
};

struct B {
   static void print() { 
      std::cout <<"Method Scope:"<< c << std::endl; // 2
      std::cout <<"Class/Struct Scope:"<< B::c << std::endl; // 2 here you can use alse ::A::c
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
   static const int c = 2;
};

struct C {
   static void print() { 
      std::cout <<"Method Scope:"<< c << std::endl; // 3
      //std::cout <<"Class/Struct Scope:"<< C::c << std::endl; //is inpossible ;)
      std::cout <<"Global Scope:"<< ::c << std::endl; // 3
   }
};

int main() {
   A::print();
   B::print();
   C::print();
   return 0;
}
于 2013-05-03T15:43:36.787 回答
0

假设您有很长的代码,其中使用了许多变量,您是否希望从函数所属的类中调用它们?说明:

a或者b

在课堂上意味着

this->a

this->b

如果你想让全局变量可见,你必须像这样使用它

::a或者 ::b在这个函数里面,所以通过:

static int f() { return ::c; }

来自标准文档,第 3.3.1 节

每个名称都被引入程序文本的某个部分,称为声明性区域,该区域是程序中该名称有效的最大部分,也就是说,该名称可以用作引用同一实体的非限定名称. 通常,每个特定名称仅在程序文本的某个可能不连续的部分(称为其范围)内有效。为了确定声明的范围,有时参考声明的潜在范围很方便。除非潜在范围包含另一个同名声明,否则声明的范围与其潜在范围相同。在这种情况下,声明的潜在范围内部(包含)声明性区域被排除在外部(包含)声明性区域的声明范围之外。

这意味着潜在的范围与声明的范围相同,除非出现另一个(内部)声明。如果发生,外部声明的潜在范围将被删除保留内部声明,因此您的全局变量被隐藏。

于 2013-05-03T15:36:47.750 回答