为什么在C++ .cpp文件中不包含单词'class'是很常见的?

Why is it common to not include the word 'class' in C++ .cpp files?

本文关键字:class 常见 cpp C++ 文件 包含单 为什么      更新时间:2023-10-16

大多数类在声明和定义之间是分开的,使用命名空间限定符定义类:

// test.h
class test 
{
    public:
        void func1(void);
    private:
        void func2(void);
};

// test.cpp
void test::func1(void)
{
    //whatever
}
void test::func2(void)
{
    //whatever
}

为什么我们通常不看到人们在。cpp文件中使用关键字class ?如以下形式:

// test.cpp
class test {
    void func1(void)
    {
        //whatever
    }
    void func2(void)
    {
        //whatever
    }
};

使用名称空间限定符只是惯例吗?还是因为当您开始通过多个源文件实现一个类时,它更有意义?

让我们从另一个角度来看这个问题…

可以对两者使用相同的语法,但它是"the other one";以下是完全有效的:

namespace ns
{
    int foo();   
}
int ns::foo() { return 0; }

看起来像这样,这是一个相反的问题,很有趣,"为什么在。cpp文件中包含'namespace'这个词很常见?"

名称空间和类之间有一个实质性的区别,使得namespace {}在很多地方都是必需的:名称空间对扩展是开放的,但是类完全由它们的(唯一的)定义来定义。

与类一样,你不能使用上面的语法向命名空间添加任何东西;您不能仅用int ns::bar() { return 9; }添加上面的函数bar,向命名空间添加名称的唯一方法是"从内部"。

而且,正如许多人发现的那样,将整个文件包装在名称空间中而不使用限定名是很方便的,即使您没有向其添加任何名称。

因此"namespace"的流行:它是命名空间的可扩展性带来的便利。

另一个问题是,"test.cpp"的含义将取决于编译器是否已经看到了类定义-没有它,这是一个具有两个私有函数的类的有效和完整的定义。
这种"远距离操作"依赖于可能非常遥远的代码,处理起来很痛苦。
同样值得注意的是,名称空间是在"带类的C"被创建大约二十年后添加的,当时c++是一种成熟的语言,改变几十年来没有改变的结构的含义几乎是不可想象的。
特别是如果它所做的只是节省一些按键。