名称空间笔记(上)
Namespace 剖析------jiese1990
namespace,我有见过两种翻译“名称空间”和“命名空间”!这里我们姑且用“名称空间”;
依稀记得c++的第一课讲的就是namespace的使用!c++学了两年了,一直以来,都在用别人定义好的namespace,很少定义过自己的namespace!于是昨天花了些时间,看了看namespace的知识点!记下了这篇笔记!如果你能很轻松愉快的把笔记后的练习完成,那么,建议不要浪费时间,看这篇笔记(下面的东西都是基础的东西)!
定义名称空间
方法一:申明和定义放在一起
namespace jiese
{
int j;
void PrintText(char *text)
{
printf(text);
}
}
该方法只适合,用在cpp文件里;
在头文件里就适合这样定义名称空间,因为我们在名称空间里不仅仅是申明了变量j,还定义了变量j,而且定义了函数!若放在头文件里,当多次包含该头文件时(在多个cpp文件里#include “ “),会报“重定义;多次初始化“错!
这点与我们不在h文件中不放类的定义,只放申明,还有函数也不在头文件定义,是一个道理!(其深层原理就不再解释,如果这点还不清楚的话,那么就需要恶补下c++了)
方法二:名称空间里的数据结构,的声明和定义完全分开!
申明:
namespace jiese
{
extern int j;
void PrintText( char * text);
class CTextClass
{
public:
int m_no;
CTextClass();
};
}
定义:
定义1
namespace jiese
{
int j=0;
void PrintText( char * text)
{
printf(text);
}
CTextClass::CTextClass()
{
this->m_no=-1;
}
}
也可以如下定义,与上面等价
(如果,名称空间申明是在一个头文件里,要将该头文件#include)
定义2
using namespace jiese;
CTextClass::CTextClass()
{
this->m_no=-1;
}
void jiese::PrintText(char * text)
{
printf(text);
printf("wai");
}//变量的定义不能像函数那样定义!必须如下
namespace jiese
{
int j=0;
}
名称空间是开放的,可以随时在名称空间里添加名称!
但,在同一个名称空间里不能有同名的名称!
如:
情况一:在A.h文件里
namespace A
{
int j=0;
}
在B.cpp里
namespace A
{
int j=0;
}
“情况一”下,会报“重定义;多次初始化“错!同理于我们在不同文件里定义同名的全局变量,报错!
名称空间,我的理解是,在没有名称空间机制之前,我们只有一个名称空间就是一个默认的名称空间!我们的数据的声明定义,都是在同一个默认的名称空间里!当有了名称空间机制之后我们不仅仅有一个默认的名称空间,还可以定义自己的名称空间!在不同的名称空间里的名称(数据名称,和函数名称等)互不干扰!
练习:
OK,有了上面的基础,那么下面程序输出的结果是什么?
//程序
namespace jiese1
{
int j=1;
}
char j='A';
int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
cout<<j<<endl;
double j=-1.009;
using namespace jiese1;
cout<<jiese1::j<<endl;
cout<<j<<endl;
{
using namespace jiese1;
float j=250;
cout<<j;
}
return 0;
}
你知道答案吗????下篇为您揭晓答案!