命名空间与C ++编程语言中的范围是否相同?这两个词是同义词,可以互换使用吗?
答案 0 :(得分:10)
没有。命名空间是一种范围,但有几种范围不是命名空间。一些例子是:
{...}
中包含的语句块中声明; 答案 1 :(得分:2)
不完全。
在C ++中,范围通常由开括号和结束括号确定:{
和}
,其中包括:
然而,有一些例外情况或许多声明的特殊性可能会引入将存在于它们之前的范围内的变量:
for (int i = 0; i < 10; ++i) {
// i accessible here
}
while (int c = getchar()) {
// c accessible here
}
try {
// ...
} catch(std::exception const& e) {
// e accessible here
}
void foo(int i) {
// i accessible here
}
最令人惊讶的是if
声明:
if (int var = /**/)
{
// var is accessible here
}
else
{
// var is accessible here too!
}
这些范围有点特殊:)
它们也可以在隐式作用域中退化,因为C规则(C ++也遵循这些规则)使{
和}
对对语句可选:
for (int i = 0; i < 10; ++i) std::cout << i << "\n";
// i no longer accessible here
模板参数还有一个范围:它们在它们的声明点生效,并一直存在到它们模板化的类或函数的末尾。
template <typename U>
void foo() {
} // U accessible up until this point
最后,还有“最外层”范围,即全局命名空间,在某种程度上是“根”范围。
答案 2 :(得分:0)
不,他们不是。
范围与对象的生命周期非常相似 - 类似,不一样。
class A;
//....
{
A a; //begin scope for object a
}
//object a is out of scope
命名空间是一种在C ++中对声明和定义进行分组的有用方法。
您可以将命名空间命名为范围,但范围远不止于此。请参阅范围解析运算符:方法或变量可以是类范围的一部分,而不是命名空间。
答案 3 :(得分:0)