在 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++ 中,阴影变量名称的范围解析(“优先顺序”)是啥?的主要内容,如果未能解决你的问题,请参考以下文章

:: c++中模板函数调用前面的范围解析运算符

如何正确命名变量以避免在Python中出现类似“外部作用域的阴影名称”的警告

GNU C++的符号改编机制介绍(函数的名称粉碎格式解析)

关于 C++ 类的问题(继承、变量范围和函数)

开心档之C++ 变量类型

如何访问 C 中的阴影全局变量?