名称表示相同的实体

时间:2014-05-15 03:41:34

标签: c++ scope declaration

以下声明性区域的定义:

  

在名为a的程序文本的某些部分中引入了每个名称   声明性区域,这是程序中最大的部分   该名称有效,即该名称可用作其名称   非限定名称,指代同一实体。

我们在下面的规范中有例子:

int j = 24;
int main() {
    int i = j, j;
    j = 42;
}
  

标识符j被声明为名称两次(并使用两次)。该   第一个j的声明性区域包括整个例子。该   第一个j的潜在范围在j和之后立即开始   延伸到程序的末尾,但其(实际)范围不包括   和之间的文字。第二个声明区域   j的声明(分号前面的j)包括所有   {和}之间的文本,但它的潜在范围排除了   宣言我j的第二个声明的范围是相同的   作为其潜在的范围。

目前还不清楚如何确定任意名称的声明区域。至少我无法将其纳入标准。

1 个答案:

答案 0 :(得分:1)

在文件范围内声明的变量的潜在范围(即,不在命名空间,类或函数内)是从声明变量的点到文件结尾。在函数内声明的变量的潜在范围是从声明变量的点到声明变量的close括号内。

如果在某个内部范围声明了同名的新变量,则变量的实际范围可能小于潜在范围。这称为 shadowing

// The following introduces the file scope variable j.
// The potential scope for this variable is from here to the end of file.
int j = 42; 

// The following introduces the file scope variable k.
int k = 0;

// Note the parameter 'j'. This shadows the file scope 'j'.
void foo (int j) 
{
    std::cout << j << '\n'; // Prints the value of the passed argument.
    std::cout << k << '\n'; // Prints the value of the file scope k.
}
// The parameter j is out of scope. j once again refers to the file scope j.


void bar ()
{
    std::cout << j << '\n'; // Prints the value of the file scope j.
    std::cout << k << '\n'; // Prints the value of the file scope k.

    // Declare k at function variable, shadowing the file scope k.
    int k = 1; 
    std::cout << k << '\n'; // Prints the value of the function scope k.

    // This new k in the following for loop shadows the function scope k.
    for (int k = 0; k < j; ++k) { 
        std::cout << k << '\n'; // Prints the value of the loop scope k.
    }
    // Loop scope k is now out of scope. k now refers to the function scope k.

    std::cout << k << '\n'; // Prints the function scope k.
}
// Function scope k is out of scope. k now refers to the file scope k.