为什么我可以在头文件中实现类的成员函数?

ctx*_*xrr 2 c++ linker

我知道您只应该在标头中声明一个函数,并避免定义它,因为如果有多个源文件包含此标头,则链接器将告诉您有重复的符号。

我也知道建议在标头中声明一个类并在源文件中实现成员函数

但是,这是我的问题:我尝试在标头中定义整个类(包括成员函数的所有实现),然后发现当我将此标头包含在两个源文件中时,链接程序没有错误。

这是我的header.h文件

class ctr
{
public:
    ctr();
    ctr(char *s);
    int showname(){return 0;}
private:
    char *name;

};
Run Code Online (Sandbox Code Playgroud)

在其他两个文件中,我包含header.h

//file1.cpp
#include header.h

//file2.cpp
#include header.h
Run Code Online (Sandbox Code Playgroud)

然后编译它们 g++ file1.cpp file2.cpp

那么谁能告诉我为什么正常的函数定义会给我一个错误,但是类定义可以吗?

0x4*_*2D2 6

在类主体中定义的成员函数隐式inline [class.mfct] / p2:

成员函数可以在其类定义中定义(8.4),在这种情况下,它是一个内联成员函数[..]

inline说明符允许跨多个翻译单元定义功能。