18_命名空间

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{代码} 就行, 这样他们都有相同的命名空间, 定义部分和实现部分都要加上