C++命名空间
来源:互联网 发布:商品期货软件 编辑:程序博客网 时间:2024/06/14 16:49
在C++程序中我们经常看到程序开始有这么一句:
Using namespacestd
这就是使用了命名空间std。
1、为何使用命名空间
以一个例子来说明不使用命名空间会引起的冲突:
程序员A在头文件header1.h中申明了类Student和函数fun,在源文件中定义如下:
class Student { public: Student(int n,string nam,int a) { number=n; name=nam; age=a; } void get_data(); private: int number; string name; int age; }; voidStudent::get_data() { cout<<number<<" "<<name<<" "<<age<<endl; } doublefun(double a,double b) { return sqrt(a+b); }
程序员B在头文件header2.h中申明了类Student和函数fun,在源文件中定义如下:
class Student { public: Student(int n,string nam,int a) { number=n; name=nam; age=a; } void get_data(); private: int number; string name; int age; }; voidStudent::get_data() { cout<<number<<" "<<name<<" "<<age<<endl; } doublefun(double a,double b) { return sqrt(a-b); }
在main函数中同时包含头文件header1.h,header2.h:
#include"header1.h"
#include"header2.h"
usingnamespacestd;
int_tmain(intargc,_TCHAR*argv[])
{
Studentstud1(1001,"Jane",20);
stud1.get_data();
cout<<fun(10,6)<<endl;
}
此时编译程序就会出错,因为在预编译后,头文件的内容取代了对应#include命令行,这样在同一个程序中就出现了两个Student和fun,出现名字冲突,即在同一个作用域中有两个或多个同名的实体。如在大型的应用软件的设计中,往往是由若干人合作完成,不同程序员定义了相同的类名或函数名经常发生,那么如何避免发生冲突呢,这就用到了命名空间。
2、什么是命名空间
所谓命名空间,实际上是程序员命名的内存区域。程序员可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分开来。
namespacens
{
voidcout();
voidcin();
}
若命名空间ns中定义了与std中同名的函数cout、cin。当我们要区分开时,需要作用域分辨符“::”,如ns::cout,std::cout。
3、使用命名空间成员的方法
我们经常使用命名空间成员的一种方法是:using namespace+命名空间名。这样就能一次申明命名空间中的全部成员。
如:usingnamespace std
4、标准命名空间
这里借用了浮生专栏博客里的一段话(原文链接点击打开链接):
std命名空间是C++中标准库类型对象的命名空间。
在标准C++以前,都是用#include<iostream.h>这样的写法的,因为要包含进来的头文件名就是 iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混 淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新 命名,如原来的string.h 就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include <iostream>。
并不是写了#include<iostream>就必须用using namespace std;我们通常这样的写的原因是为了一下子把std名字空间的东东全部暴露到全局域中(就像是直接包含了iostream.h这种没有名字空间的头文件 一样),使标准C++库用起来与传统的iostream.h一样方便,但并不建议这样做,因为使用using namespace std;的话就没有起到命名空间的作用。再次回到了如同没有涉及命名空间时,所有标示符都定义在全局作用于中的混乱情况,不利于程序员创建新对象。
如果不用using namespace std;使用标准库时就得时时带上名字空间的全名,如std::cout << "hello" << std::endl;
<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
如下写法,则出错
#include<iostream.h>
usingnamespace std;
所以要么写成
#include <iostream>
usingstd::cout;
usingstd::cin;
usingstd::cerro;
要么写成
#include<iostream.h>
当然最好是前种,因为后种情况如果遇到用户定义的标示符在头文件中已经定义,可能会导致错误,采用using namespace std也是如此。
- C/C++:命名空间
- C++-namespace(命名空间)
- C++-namespace(命名空间)
- C++namespace命名空间
- C#.Net命名空间
- C++_命名空间
- C++namespace命名空间
- 【C++】命名空间
- [C++]namespace命名空间
- C\C++命名空间
- C++:命名空间(namespace)
- [c++]命名空间
- <C++>2.命名空间
- C语言命名空间详解
- C++Primer学习-命名空间
- 《C++Primer》读书笔记--命名空间
- C++std命名空间详解
- 《C++》15 C++ 命名空间
- JavaScript--点击颜色,为主题更换背景颜色
- AndroidStudio错误local path doesn't exist解决办法
- C#基础--之数据类型
- NSMakeRange,substringWithRange,substringToIndex,substringFromIndex区别和联系
- 玩一下比特币-超土版
- C++命名空间
- 线程同步与死锁
- 采用队列实现自底向上链表归并排序
- scala学习之:List的foldLeft、foldRight操作实战
- Javascript模块化编程:require.js的用法
- Python Web 实战 - 搭建Django环境和初步使用
- Function.prototype.bind、call与apply方法简介
- 【Unity3D Game develop by example】简单的例子—平板接掉落球
- JSBadgeView的使用