2011-11-20 55 views

回答

10

不。命名空间是一种范围,但有几种范围不是命名空间。一些实例是:

  • 块范围:封闭在{...}语句块内声明符号(通常是局部变量);
  • 功能范围:功能的最外面的块范围;
  • 班级范围:班级的成员。
+1

+1;我认为“块范围”包括几个变体,如方法范围,函数范围,循环范围... - http://msdn.microsoft.com/en-us/library/b7kfh662(v=vs.80).aspx –

+0

当没有一组花括号时,块范围是否也包含紧跟在控制流程语句之后的语句? –

+0

碰巧,“全局作用域”是一个名称空间([basic.scope.namespace]/3)。 –

0

不,他们不是。

范围与对象的生命周期非常相似 - 相似,不一样。

class A; 

//.... 
{ 
    A a; //begin scope for object a 
} 
//object a is out of scope 

命名空间是一种将C++中的声明和定义分组的有用方法。

您可以将命名空间命名为作用域,但范围远不止于此。请参阅范围解析运算符:方法或变量可以是类作用域的一部分,而不是名称空间。

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++也遵循)使{}对可选为st atements:

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 

最后,还有“最外层”作用域,即全局命名空间,它是“根”作用域。

+0

为最令人惊讶的if语句+1。早就见过这个了。 – Nawaz

+0

@Nawaz:我必须承认我真的很喜欢这种可能性,因为我总是努力给我的变量提供更大的范围:) –

+0

这就是为什么如果标准允许的话,声明及其范围完全有意义。 – Nawaz