在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?
Posted
技术标签:
【中文标题】在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?【英文标题】:In C++, what is the scope resolution ("order of precedence") for shadowed variable names?在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是什么? 【发布时间】:2011-02-17 19:01:36 【问题描述】:在 C++ 中,shadowed 变量名的作用域解析(“优先顺序”)是什么?我似乎在网上找不到简明的答案。
例如:
#include <iostream>
int shadowed = 1;
struct Foo
Foo() : shadowed(2)
void bar(int shadowed = 3)
std::cout << shadowed << std::endl;
// What does this output?
int shadowed = 4;
std::cout << shadowed << std::endl;
// What does this output?
int shadowed;
;
int main()
Foo().bar();
我想不出变量可能会发生冲突的任何其他范围。如果我错过了,请告诉我。
在bar
成员函数中所有四个shadow
变量的优先级顺序是什么?
【问题讨论】:
您可以在bar()
内有一个代码块,它也声明shadowed
。
为bar()
中的代码块添加了大小写。
@Ignacio:你的意思是说“范围分辨率”是关于阴影的“优先顺序”的正确术语吗?
【参考方案1】:
您的第一个示例输出 3。您的第二个示例输出 4。
一般的经验法则是查找从“最局部”到“最不局部”变量。因此,这里的优先级是块 -> 本地 -> 类 -> 全局。
您还可以显式访问每个阴影变量的大多数版本:
// See http://ideone.com/p8Ud5n
#include <iostream>
int shadowed = 1;
struct Foo
int shadowed;
Foo() : shadowed(2)
void bar(int shadowed = 3);
;
void Foo::bar(int shadowed)
std::cout << ::shadowed << std::endl; //Prints 1
std::cout << this->shadowed << std::endl; //Prints 2
std::cout << shadowed << std::endl; //Prints 3
int shadowed = 4;
std::cout << ::shadowed << std::endl; //Prints 1
std::cout << this->shadowed << std::endl; //Prints 2
//It is not possible to print the argument version of shadowed
//here.
std::cout << shadowed << std::endl; //Prints 4
int main()
Foo().bar();
【讨论】:
【参考方案2】:它应该打印出 3. 基本规则主要是通过文件向后工作到编译器会看到的最新定义(编辑:没有超出范围),这就是它使用的.对于类的局部变量,您遵循相同的except,所有类变量都被视为在类定义的开头定义。请注意,这或多或少是类独有的。例如,给定的代码如下:
int i;
int x()
std::cout << i << '\n'; // prints 0;
int i=1;
即使 有一个 i
是函数的局部变量,但最近看到的使用 cout
的定义是全局的,所以这就是该表达式中的 i
所指的到。但是,如果这是在一个类中:
int i;
class X
void y() std::cout << i << "\n";
X() : i(2)
int i;
;
那么cout
表达式将引用X::i
,即使在解析y
时还没有看到它的定义。
【讨论】:
“类的局部变量” 更好的说法是:类的成员变量。以上是关于在 C++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?的主要内容,如果未能解决你的问题,请参考以下文章