有这个代码:
#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
首先声明哪个变量并不重要:如果一个类中有一个同名的变量,则该变量胜过全局变量。否则,只需声明一个名称为其中一个成员变量的全局变量,就会给现有代码带来很多麻烦!
当然,您的班级可以使用范围解析运算符c直接引用全局:
static int f() { return ::c; }
现在您的程序将打印3而不是2.
不是声明顺序的问题,而是变量范围的问题,使用的变量在当前方法/函数之前在类/结构和全局上下文中搜索,例如:
#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;
}
假设您有很长的代码,其中使用了许多变量,您是否希望从函数所属的类中调用它们?说明:
a或者b
在课堂上意味着
this->a
this->b
如果你想让全局变量可见,你必须像这样使用它
::a或者 ::b在这个函数里面,所以通过:
static int f() { return ::c; }
来自标准文档,第 3.3.1 节
每个名称都被引入程序文本的某个部分,称为声明性区域,该区域是程序中该名称有效的最大部分,也就是说,该名称可以用作引用同一实体的非限定名称. 通常,每个特定名称仅在程序文本的某个可能不连续的部分(称为其范围)内有效。为了确定声明的范围,有时参考声明的潜在范围很方便。除非潜在范围包含另一个同名声明,否则声明的范围与其潜在范围相同。在这种情况下,声明的潜在范围内部(包含)声明性区域被排除在外部(包含)声明性区域的声明范围之外。
这意味着潜在的范围与声明的范围相同,除非出现另一个(内部)声明。如果发生,外部声明的潜在范围将被删除,只保留内部声明,因此您的全局变量被隐藏。