为什么在头文件中定义类时没有多重定义错误?

Cod*_*rus 10 c++ linker header-files

我不确定我是否正确地提出了这个问题,但让我解释一下.

首先,我读了这篇解释声明和定义之间差异的文章:http: //www.cprogramming.com/declare_vs_define.html

其次,我从之前的研究中了解到,在头文件中定义变量和函数是不好的做法,因为在链接阶段,您可能有多个同名的定义会引发错误.

但是,为什么课不会发生这种情况呢?根据另一个SO答案( 定义和声明之间有什么区别?),以下是一个类定义:

    class MyClass {
        private:
        public:
    };
Run Code Online (Sandbox Code Playgroud)

如果上面的定义是在头文件中.然后,据推测,您可以有多个.cpp文件#include该标头.这意味着在多个.o文件中编译后,类被多次定义,但似乎没有引起太多问题......

另一方面,如果它是在头文件中定义的函数,它会明显地引起问题...从我的理解... mayb?

那么类定义有什么特别之处呢?

eca*_*mur 12

一个定义规则(3.2,[basic.def.odr])不同地适用于的类和函数:

1 - 任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.

[...]

4 - 每个程序应包含该程序中使用的每个非内联函数或变量的一个定义[...]

因此,虽然(非内联)函数可以在整个程序中最多定义一次(并且如果它们被调用或者使用其他函数,则只需定义一次),可以将类定义为翻译单元(源文件)的次数,但每个翻译单元不超过一次.

这样做的原因是,由于类是类型,因此它们的定义对于能够在翻译单元之间共享数据是必要的.最初,类(structC中的类)没有任何需要链接器支持的数据; C++引入了虚拟成员函数和虚拟继承,这需要链接器支持vtable,但这通常通过将vtable附加到成员函数的(定义)来解决.