【发布时间】:2017-10-13 15:46:29
【问题描述】:
我现在正在使用 Accelerated C++,但我对范围和代码块缺乏理解。
第 1 章末尾有一个练习,要你决定这段代码是否会运行:
#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;
}
我确定不会,但确实如此。我的业余编程经验是,在一个块中声明的变量可用于其中包含的其他块,但不能用于块外的其他块。
这必须至少是对的,因为删除 s 的第二个声明会输出两次“字符串”,给我的印象是第二个块中声明的 s 也出现在第三个块中。
我还尝试完全删除第三个块的大括号,这导致了我最初预期的编译错误。但这与声明一个已经存在于第三个块范围内的常量有什么不同呢?如果在较小的范围内没有第二个声明,则常量的声明是否仅延续到较小的范围内?
到目前为止,我已经阅读了本书中的所有内容,看看我是否遗漏了什么,但我找不到任何关于变量和 const 声明如何受花括号影响的信息。
【问题讨论】:
-
尝试在前两个
}之间添加另一个std::cout << s << std::endl; -
第二个
s是一个新变量,它从外部作用域中隐藏了一个变量。它也可以有不同的类型。 -
要查找的关键字是:shadowing。嵌套范围内的
s会遮盖上范围内的s。
标签: c++ visual-studio scope constants accelerated-c++