C++ 除了使用标准命名空间 using namespace std,还可以使用自己命名的空间,其目的主要是限制变量或者函数的使用范围。在实际开发中,有时多个人难免会命名相同的函数名字,为了明确该函数使用范围,引进命名空间。
其特性主要如下:
1-命名空间将全局作用域分成不同的部分, |
2-不同命名空间中的标识符可以同名而不会发生冲突 |
3-命名空间可以发生嵌套 |
4-全局作用域也叫默认命名空间 |
测试代码:
命名空间1 和命名空间2都包含同名函数和复数结构体的定义,
#pragma once
#include <iostream>
//命名空间1
namespace spaceTest1
{
struct Complex {
int x;
int y;
};
void ComplexAdd(Complex a, Complex b, Complex* result);
void show();
}
//命名空间2
namespace spaceTest2
{
struct Complex {
double x;
double y;
};
void ComplexAdd(Complex a, Complex b, Complex* result);
void show();
}
void spaceTest1::ComplexAdd(spaceTest1::Complex a, spaceTest1::Complex b, spaceTest1::Complex* result) {
Complex temp;
temp.x = a.x + b.x;
temp.y = a.y + b.y;
*result = temp;
}
void spaceTest1::show() {
std::cout << "this is namespace [spaceTest1]" << std::endl;
}
void spaceTest2::ComplexAdd(spaceTest2::Complex a, spaceTest2::Complex b, spaceTest2::Complex* result) {
Complex temp;
temp.x = a.x + b.x;
temp.y = a.y + b.y;
*result = temp;
}
void spaceTest2::show() {
std::cout << "this is namespace [spaceTest2]" << std::endl;
}
#include <stdio.h>
#include "NameSpace.h"
using namespace spaceTest1;
//using namespace spaceTest2;
void test() {
//隐式:根据声明的命名空间调用对应的函数
show();
Complex paramA, paramB, result;
paramA.x = 4; paramA.y = 4;
paramB.x = 8; paramB.y = 8;
ComplexAdd(paramA, paramB, &result);
std::cout << "ComplexAdd: " << result.x << "+" << result.y << "i" << endl;
//显示调用,在函数或者类型前声明空间
spaceTest1::Complex paramA0, paramB0, result0;
paramA0.x = 3; paramA0.y = 3;
paramB0.x = 7; paramB0.y = 7;
spaceTest1::ComplexAdd(paramA0, paramB0, &result0);
std::cout << "ComplexAdd: " << result0.x <<"+"<< result0.y<<"i"<< endl;
spaceTest2::Complex paramA1, paramB1, result1;
paramA1.x = 3.123; paramA1.y = 3.123;
paramB1.x = 7.123; paramB1.y = 7.123;
spaceTest2::ComplexAdd(paramA1, paramB1, &result1);
std::cout << "ComplexAdd: " << result1.x<< "+"<< result1.y << "i" << endl;
}
结果:
程序开始首先调用了show函数,由于声明了命名空间sapceTest1,编译知道应该调用spaceTest1下的show函数和CompleAdd函数。但一般情况下,我们习惯显式指明其所属命名空间:spaceTest1::ComplexAdd(paramA0, paramB0, &result0);