命名空间可以用来避免命名冲突
我们之所以可以用cout << "Hello" << endl;
进行打印就是因为有using namespace std;
注意:命名空间不影响内存布局
- 命名空间的定义使用关键字
namespace
,后跟命名空间的名称 - 本质上,命名空间就是定义了一个范围
Person.h声明
// 第一个命名空间
namespace DX {
int g_no;
class Person {
public:
int m_height;
};
void test() {
cout << "DX::test()" << endl;
}
}
// 第二个命名空间
namespace FX {
int g_no;
class Person {
public:
int m_age;
};
void test() {
cout << "FX::test()" << endl;
}
}
为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称
使用示例:
FX::g_no = 1;
DX::g_no = 2;
FX::Person *p1 = new FX::Person();
p1->m_age = 10;
DX::Person *p2 = new DX::Person();
p2->m_height = 180;
test();
FX::test();
DX::test();
调用示例:导入头文件
#include <iostream>
#include "Person.h"
using namespace std;
int main() {
{ // 大括号->局部变量->大括号后就会销毁
Person person;
person.setAge(20);
cout << person.getAge() << endl;
}
getchar();
return 0;
}
using 指令
可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称
using namespace MJ;
g_no = 10;
Person person;
test()
默认的命名空间::,没有名字
比如全局函数
void test() {
cout << "test()" << endl;
}
调用示例:
#include <iostream>
using namespace std;
int main() {
::test();
getchar();
return 0;
}
多文件开发
Car.h
#pragma once
namespace DX {
class Car {
public:
Car();
~Car();
};
}
Car.cpp
#include "Car.h"
namespace DX {
Car::Car() {
}
Car::~Car() {
}
}
使用示例
#include <iostream>
using namespace std;
using namespace DX;
#include "Car.h"
int main() {
DX::Car car;
getchar();
return 0;
}
命名空间嵌套
namespace DX {
namespace SS {
int g_no;
class Person {
};
void test() {
}
}
void test() {
}
}
使用示例
::DX::SS::g_no = 30;
DX::SS::g_no = 20;
using namespace DX;
SS::g_no = 30;
using namespace DX::SS;
g_no = 10;
命名空间的合并
namespace DX {
int g_no;
}
namespace DX {
int g_age;
}
等价于
namespace DX {
int g_no;
int g_age;
}