第五章 C++编程之命名空间使用
5.1 不同的命名空间中包含了同样的函数(同名同参函数冲突)
5.1.1 代码例程
1、声明命名空间A的函数(文件名:animal.h)
#ifndef __ANIMAL_H__
#define __ANIMAL_H__
#include <stdio.h>
namespace A{
void public_func(void);//命名空间中的方法
}
#endif
2、实现命名空间A中的方法(文件名:animal.cpp)
#include "animal.h"
namespace A{
void public_func(void)
{
printf("this is in namespace A::public function\n");
}
}
3、声明命名空间P的函数(文件名:person.h)
#ifndef __PERSON_H__
#define __PERSON_H__
#include <stdio.h>
namespace P{
void public_func(void);
}
#endif
4、实现命名空间P中的方法(文件名:person.cpp)
#include "person.h"
namespace P{
void public_func(void)
{
printf("this is in namespace p::public function\n");
}
}
5、使用命名空间
方式1:直接声明函数
#include "person.h"
#include "animal.h"
using P::public_func;//此处声明了public_func函数来自哪里
int main(int argc,char**argv)
{
public_func();
return 0;
}
方式2:直接声明命名空间
#include "person.h"
#include "animal.h"
using namespace A;//直接声明命名空间(该空间包含了被调用的函数)
int main(int argc,char**argv)
{
public_func();
return 0;
}
方式3:两个命名空间的同名同参(同名不同参不会报错)函数导致报错(此处编译会报错)
#include "person.h"
#include "animal.h"
using namespace A;
using namespace P;
int main(int argc,char**argv)
{
public_func();
return 0;
}
或者另外一种类似的情况:
#include "person.h"
#include "animal.h"
using A::public_func;
using P::public_func;
int main(int argc,char**argv)
{
public_func();
return 0;
}
方式4:调用时确定使用那个命名空间的函数
#include "person.h"
#include "animal.h"
using namespace A;
using namespace P;
int main(int argc,char**argv)
{
A::public_func();
return 0;
}
5.1.2 小结
不同的命名空间存在同名同参函数时,主要考虑同名函数不能存在歧义,导致函数调用出错
5.2 如何使用命名空间中的方法
方法1:在全局位置声明命名空间的方法
#include "animal.h"
using A::public_func;
int main(int argc,char**argv)
{
//A::public_func();
public_func();
return 0;
}
方法2:在调用的函数里声明命名空间的方法
#include "animal.h"
//using namespace A;
//using namespace P;
//using A::public_func;
//using P::public_func;
int main(int argc,char**argv)
{
using A::public_func;
//A::public_func();
public_func();
return 0;
}
方法3:全局声明命名空间
#include "animal.h"
using namespace A;
int main(int argc,char**argv)
{
public_func();
return 0;
}
方法4:在调用的函数里声明命名空间
#include "animal.h"
int main(int argc,char**argv)
{
using namespace A;
public_func();
return 0;
}
方法5:直接调用已包含的命名空间的方法
#include "animal.h"//这里声明了命名空间和对应的方法
int main(int argc,char**argv)
{
//using namespace A;
A::public_func();//直接调用命名空间里的方法
return 0;
}