命名空间可以用来避免命名冲突

我们之所以可以用cout << "Hello" << endl;进行打印就是因为有using namespace std;

注意:命名空间不影响内存布局

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;
}