命名空间与C++编程语言中的作用域是否一样?这两个词是同义词吗?可以互换使用吗?命名空间与C++中的范围相同吗?
2
A
回答
10
不。命名空间是一种范围,但有几种范围不是命名空间。一些实例是:
- 块范围:封闭在
{...}
语句块内声明符号(通常是局部变量); - 功能范围:功能的最外面的块范围;
- 班级范围:班级的成员。
0
不,他们不是。
范围与对象的生命周期非常相似 - 相似,不一样。
class A;
//....
{
A a; //begin scope for object a
}
//object a is out of scope
命名空间是一种将C++中的声明和定义分组的有用方法。
您可以将命名空间命名为作用域,但范围远不止于此。请参阅范围解析运算符:方法或变量可以是类作用域的一部分,而不是名称空间。
0
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
最后,还有“最外层”作用域,即全局命名空间,它是“根”作用域。
相关问题
- 1. 命名空间范围
- 2. SOAP/XML中的命名空间范围
- 3. 类应该与命名空间名称相同吗?
- 4. 在另一个命名空间中使用命名空间的范围
- 5. 多文件和命名空间范围
- 6. 命名空间范围问题
- 7. 相同命名空间中的相同类名
- 8. C++的命名空间范围的初始化变量
- 9. 使用C++命名空间的文件范围数据
- 10. C++ - 类与命名空间
- 11. C#完全限定的命名空间与小命名空间
- 12. 命名空间与类名同名
- 13. Excel:命名范围与VBA
- 14. Struts 2:根名称空间的行为与默认命名空间相同
- 15. 不同命名空间中的相同函数名称
- 16. 命名空间具有相同的变量具名命名空间声明
- 17. C#中的命名空间#
- 18. c中的命名空间#
- 19. c中的命名空间#
- 20. C++中的命名空间
- 21. 获取函数与命名空间相同的签名,并在C++
- 22. 命名命名空间具有相同的类名
- 23. 如何设置类型别名在C#中整个命名空间范围
- 24. 命名空间规范
- 25. C++,跨越不同的命名空间
- 26. 合同名称与命名空间名称相同,有什么大不了的?
- 27. “不命名类型与命名空间相同”是否适用于命名空间模块?
- 28. 与给定的时间范围相交查找时间范围
- 29. 是否可以引用两个命名空间相同的命名空间?
- 30. Excel中的命名范围
+1;我认为“块范围”包括几个变体,如方法范围,函数范围,循环范围... - http://msdn.microsoft.com/en-us/library/b7kfh662(v=vs.80).aspx –
当没有一组花括号时,块范围是否也包含紧跟在控制流程语句之后的语句? –
碰巧,“全局作用域”是一个名称空间([basic.scope.namespace]/3)。 –