【问题标题】:Why I can implement the class's member function in header file?为什么我可以在头文件中实现类的成员函数?
【发布时间】:2015-01-28 02:44:43
【问题描述】:

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

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

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

这是我的 header.h 文件

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

};

在另外两个文件中,我包含了 header.h

//file1.cpp
#include header.h

//file2.cpp
#include header.h

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

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

【问题讨论】:

  • 因为他们是inlined
  • 问题是当我们知道的事情不是真的时。您可以在标头中使用 inline 函数,C++ 编译器 + 链接器可以很好地处理它们。在类内部实现的函数是内联函数。

标签: c++ linker


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2017-10-11
    相关资源
    最近更新 更多