如何理解不同块作用域之间的const变量

时间:2019-09-12 14:05:41

标签: c++

我是C ++的初学者。我从《加速的c ++》一书中学到了关于块范围内的const变量。这意味着“范围结束于}时,“ const变量将被销毁。

但是在测试中:const字符串变量s在第一个块内定义。在第二个块中,还定义了s。打印第二个s时,第一个块的s未被销毁。

我认为程序无效,但是编译程序时结果完全正确。我不知道为什么。请帮助我理解代码。

#include <iostream>
#include <string>

int main()
{
    const std::string s = "a string";
    std::cout << s << std::endl;
    {
        const std::string s = "another string";
        std::cout << s << std::endl;
    }
    return 0;
}

结果是

  

一个字符串

     

另一个字符串

1 个答案:

答案 0 :(得分:1)

通过以下方式扩展程序

#include<iostream>
#include<string>

const std::string s = "a first string";

int main()
{
    std::cout << s << std::endl;

    const std::string s = "a string";
    std::cout << s << std::endl;

    {
        const std::string s = "another string";
        std::cout << s << std::endl;
    }

    std::cout << s << std::endl;
    std::cout << ::s << std::endl;

    return 0;
}

程序输出为

a first string
a string
another string
a string
a first string

内部作用域中的每个声明都会在外部作用域中隐藏具有相同名称的声明(可重载的函数名称除外)。但是在外部作用域中声明的变量仍然有效。如果在命名空间中将变量声明为在main之前声明并属于全局命名空间的第一个变量s,则可以使用其限定名称来访问该变量。

使用非限定名称时,编译器将从最近的作用域开始搜索其声明。