命名空间与C ++中的范围相同吗?

时间:2011-11-20 13:06:55

标签: c++

命名空间与C ++编程语言中的范围是否相同?这两个词是同义词,可以互换使用吗?

4 个答案:

答案 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)

维基百科关于Scope&amp;的文章Variables应该会有帮助。

相关问题