博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
02C++namespace命名空间
阅读量:6203 次
发布时间:2019-06-21

本文共 2554 字,大约阅读时间需要 8 分钟。

一、C++命名空间基本常识

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

1.<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,

(1)当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;

(2)当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

2.由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

(1)直接指定标识符。

std::cout<
<<3.4<

(2)使用using关键字。

using std::cout; using std::endl; using std::cin; cout<
<<3.4<
(3)使用using namespace std(最方便)。

这样命名空间std内定义的所有标识符都有效(曝光),就好像它们被声明为全局变量一样,那么以上语句可以如下写:

cout <
<< 3.4 << endl;

因为标准库非常的庞大,所以程序员在选择类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。

命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"。

示例:

#include
//方法一int main(void){ std::cout<<"hello world!"<
#include
//方法二using std::cout;using std::endl;int main(void){ cout<<"hello world!"<
#include
//方法三using namespace std;int main(void){ cout<<"hello world!"<

 

二、C++命名空间定义以及使用方法

在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突。

标准C++引入了关键字namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的作用域。

std是c++标准命名空间,c++标准程序库中的所有标识符都被定义在std中,比如标准库中的类iostream、vector等都定义在该命名空间中,使用时要加上using声明(using namespace std) 或using指示(如std::string、std::vector<int>).

C中的命名空间    在C语言中只有一个全局作用域    C语言中所有的全局标识符共享同一个作用域    标识符之间可能发生冲突C++中的命名空间    命名空间将全局作用域分成不同的部分    不同命名空间中的标识符可以同名而不会发生冲突    命名空间可以相互嵌套    全局作用域也叫默认命名空间

C++命名空间的定义:

namespace name {…}

C++命名空间的使用:

  使用整个命名空间:using namespace name;
  使用命名空间中的变量:using name::variable;
  使用默认命名空间中的变量:::variable
  默认情况下可以直接使用默 认命名空间中的所有标识符

三、C++命名空间编程实践

#include
namespace NameSpaceA{ int a = 0; }namespace NameSpaceB{ int a = 1; namespace NameSpaceC { struct Teacher { char name[10]; int age; }; }}int main(void){ using namespace NameSpaceA; using NameSpaceB::NameSpaceC::Teacher; printf("a = %d\n", a);//0 printf("a = %d\n", NameSpaceB::a);//1 Teacher t1 = { "aaa",3 }; printf("t1.name = %s\n", t1.name);//aaa printf("t1.age = %d\n", t1.age);//3 return 0;}

 

四、结论

1、当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。若不引入using namespace std ,需要这样做。std::cout。

2、c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
3、C++命名空间的定义: namespace name { … }
4、using namespace NameSpaceA;
5、namespce定义可嵌套。

转载于:https://www.cnblogs.com/xinmomoyan/p/10602790.html

你可能感兴趣的文章
监听器和过滤器
查看>>
Java核心技术卷一基础知识-第6章-接口与内部类-读书笔记
查看>>
使用coding.net来托管源码(可以免费存放私有项目的哦)(转载)
查看>>
osx snow leopard下用homebrew 安装php5.3 + php-fpm
查看>>
在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
查看>>
PHP代码实现二分法查找
查看>>
window无法启动mongodb服务:系统找不到指定的文件错误的解决方法
查看>>
VBScript开发Excel常见问题
查看>>
【GNOME 边框】GNOME窗口无边框
查看>>
stm32串口之存储与解析
查看>>
替换SQL字段中的换行符,回车符
查看>>
$("#left a",$p)的意思
查看>>
SQL自定义函数
查看>>
每天一个linux命令(23):Linux 目录结构(转)
查看>>
[LeetCode] Longest Substring with At Most Two Distinct Characters
查看>>
error MC1000: 未知的生成错误“此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。...
查看>>
jq鼠标移入和移出事件
查看>>
[LeetCode]题解(python):051-N-Queens
查看>>
Linux 发展史
查看>>
Vim相关资料(持续更新)
查看>>