-
C++教程之名空间 (Namespaces)
名空间 (Namespaces)
通过使用名空间(Namespaces)我们可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces).使用名空间的格式是:
namespace identifier { namespace-body }这里identifier 是一个有效的标示符,namespace-body 是该名空间包含的一组类、对象和函数。例如:
namespace general { int a, b; }在这个例子中,a 和 b 是名空间general中的整型变量。要想在这个名空间外面访问这两个变量,我们必须使用范围操作符::。例如,要想访问前面的两个变量,我们需要这样写:
general::a
general::b
名空间(namespaces)的作用在于全局对象或函数很有可能重名而造成重复定义的错误,名空间的使用可以避免这些错误的发生。例如:
// namespaces #include <iostream.h> namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { cout << first::var << endl; cout << second::var << endl; return 0; } |
5 3.1416 |
名空间的使用 (using namespace)
使用 using 指令后面跟namespace可以将当前的嵌套层与一个指定的名空间连在一起,以便使该名空间下定义的对象和函数可以被访问,就好像它们是在全局范围内被定义的一样。它的使用遵循以下原型定义:using namespace identifier;
例如:
// using namespace example #include <iostream.h> namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { using namespace second; cout << var << endl; cout << (var*2) << endl; return 0; } |
3.1416 6.2832 |
这里要注意,语句using namespace 只在其被声明的语句块内有效(一个语句块指在一对花括号{}内的一组指令),如果using namespace是在全局范围内被声明的,则在所有代码中都有效。例如,如果我们想在一段程序中使用一个名空间,而在另一段程序中使用另一个名空间,则可以像以下代码中那样做:
// using namespace example #include <iostream.h> namespace first { int var = 5; } namespace second { double var = 3.1416; } int main () { { using namespace first; cout << var << endl; } { using namespace second; cout << var << endl; } return 0; } |
5 3.1416 |
别名定义(alias definition)
我们以可以为已经存在的名空间定义别名,格式为:namespace new_name = current_name ;
标准名空间(Namespace std)
我们能够找到的关于名空间的最好的例子就是标准C++ 函数库本身。如ANSI C++ 标准定义,标准C++库中的所有类、对象和函数都是定义在名空间std下面的。你可能已经注意到,我们在这个教程中全部忽略了这一点。作者决定这么做是因为这条规则几乎和ANSI 标准本身一样年轻 (1997) ,许多老一点的编译器并不兼容这条规则。
几乎所有的编译器,即使是那些与ANSI 标准兼容的编译器,都允许使用传统的头文件 (如iostream.h, stdlib.h, 等等),就像我们在这个教程中所使用的一样。然而,ANSI标准完全重新设计了这些函数库,利用了模板功能,而且遵循了这条规则将所有的函数和变量定义在了名空间std下。
该标准为这些头文件定义了新的名字,对针对C++的文件基本上是使用同样的名字,但没有.h的扩展名,例如, iostream.h 变成了iostream。
如果我们使用ANSI-C++ 兼容的包含文件,我们必须记住所有的函数、类和对象是定义在名空间 std 下面的,例如:
// ANSI-C++ compliant hello world #include <iostream> int main () { std::cout << "Hello world in ANSI-C++\n"; return 0; } |
Hello world in ANSI-C++ |
// ANSI-C++ compliant hello world (II) #include <iostream> using namespace std; int main () { cout << "Hello world in ANSI-C++\n"; return 0; } |
Hello world in ANSI-C++ |
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式