目录 Table of Contents
18 命名空间
命名冲突问题
class CObject
{
public:
void Fn()
{
}
};
class CTest
{
public:
void Fn()
{
}
};
原来写 C 语言的时候, 如果我们写两个名字一样的函数的话, 就会报错
自从学了面向对象以后, 我们就可以用类来解决函数名一样的冲突问题
比如上面代码的 Fn() 函数, 因为他们俩在不同的类里面
用类这种方式已经可以解决命名冲突了, 但是还不彻底, 比如有的时候两个类的名字都是一样的
这个时候怎么办呢 ?
所以这节课我们学习命名空间 (Namespace)
命名空间的使用
命名冲突的最终解决方案就是命名空间
命名空间语法 :
namespace 名称x{
// 1. 全局变量
// 2. 函数
// 3. 类
}
namespace 名称y{
// 1. 全局变量
// 2. 函数
// 3. 类
}
我们通过代码来给大家展示一下
#include <stdio.h>
#include <windows.h>
namespace ns1{
int x = 100;
void Fn()
{
printf("ns1::Fn \n");
}
class CObject
{
public:
void Test()
{
printf("ns1::CObject::Test() \n")
}
};
}
namespace ns2{
int x = 200;
void Fn()
{
printf("ns2::Fn \n");
}
class CObject
{
public:
void Test()
{
printf("ns2::CObject::Test() \n")
}
};
}
int main(int argc, char* argv[])
{
// 全局变量
printf("%d \n", ns1::x); // :: 作用域符号, 用来表示后面成员属于谁, x 属于 ns1
// 函数
ns1::Fn();
// 类
ns1::CObject c;
return 0;
}
命名空间就是给名字起个前缀嘛, 这就避免了命名冲突
分离写法
我们通常习惯单独定义文件, 比如给类单独定义一个文件
如果你写的命名空间里面东西比较多的话, 然后每次都要加上 ns1::
就会有点麻烦
这时候你在开头加上一行 using namespace ns1;
, 我就不用强制加上前缀了
但是这里就还是有一个命名冲突的问题
你在重名的函数前面加上 ::
, 例如 ::Fn();
, 这样就告诉编译器, 我的这个函数在全局命名空间, 而不是在 ns1 命名空间里面
当然, 如果你要用 ns1 里面的 Fn()
函数, 为了避免冲突还是加上前缀 ns1::Fn();
如果我想两个文件 (一个文件一个类) 共同使用同一个命名空间怎么办 ? 很简单直接在每个文件上面写 namespace 名称x{代码}
就行, 这样他们都有相同的命名空间, 定义部分和实现部分都要加上