一般情况下,如果c++中出现两个变数、函式名、类名完全相同时,就会产生冲突。解决命名冲突的办法传统的做法是重新使用不同的标识符。但又是这样做有时反而降低程式的可读性,因此c++提供了第二种解决命名冲突的方法——名空间。将这些名字相同的变数、函式和类定义在不同的名空间中,问题就解决了。需要注意的是,同一个名空间中标识符须是唯一的。
基本介绍
- 中文名:名空间
- 名空间定义:c++的关键字namespace引导
- 套用:定名空间是C++的新特性
- 特点:降低程式的可读性
名空间简介
名空间定义用c++的关键字namespace引导,定义格式:
namespace 名空间标识符名
{
}
成员的声明
名空间成员的访问:
使用名空间成员时需用名空间名进行标识,从而解决了标识符的冲突。名空间成员访问方式如下
名空间标识符名::成员名
名空间的套用
可以指定名空间是C++的新特性,在使用STL类库时经常用到这幺一句:using namespace std;
该语句的含义是使用名空间std。使用名空间可以帮助开发程式人员在开发新的软体组件时不会和已有软体组件产生标识符命名冲突。
C++中,头档案可以使用旧版本的*.h,也可以使用不带.h扩展名的头档案。编译预处理指令可以採用任何一种形式的头档案方式,但两种头档案不能混合使用。在套用名空间时,使用编译预处理命令包含相关头档案时,应省略头档案后缀.h,例如使用iostream.h的方法如下:
#include<iostream>
套用举例:
例一:
#include<iostream>
#include<string>
using namespace std;//指示在本程式中可以使用c++标準类库中定义的名字,std是标準名空间名,在标準头档案中声明的函式、对象和类模板,都在名字空间std中声明
namespace A//用关键字定义名字空间A
{
string user_name="namespace A";
int fun()
{
int n=18;
return n;
}
void Display()
{
cout<<"In namespace A……"<<endl;
}
}
namespace B
{
string user_name="namespace B";
int fun()
{
int n=28;
return n;
}
void Display()
{
cout<<"In namespace B……"<<endl;
}
}
int main(void)
{
cout<<A::user_name<<endl;
cout<<"n="<<A::fun()<<endl;
A::Display();
cout<<endl;
cout<<B::user_name<<endl;
cout<<"n="<<B::fun()<<endl;
B::Display();
cout<<endl;
return 0;
}
例二:
#include<iostream>
using namespace std;
int main(void)
{
std::cout<<"This is a C++ program!"<<endl;
return 0;
}
C++中为什幺增加“名空间”和“作用域”?
C语言中规定每个变数都有其有效地作用域,只能在变数的作用域内使用该变数,不能使用其他作用域中的变数。例如:
float a=13.5;
void main()
{
int a=5;
cout<<a;
}
程式中有两个a变数:一个是全局变数a,实型;另一个是main函式中的整型变数a,它是在main函式中有效的局部变数。根据规定在main函式中局部变数讲禁止同名的全局变数。因此上述的输出是局部变数a的值5,而不是全局实型变数a的值13.5.如果想输出全局实型变数的值,有什幺办法呢?c++提供了作用域运算符::,它能指定所需要的作用域。
float a=13.5;
void main()
{
int a=5;
cout<<a<<endl;
cout<<::a<<endl;
}
::a表示全局变数a。请注意:不能用::访问函式中的局部变数。