成员函数定义中的内联关键字

时间:2011-02-27 06:18:12

标签: c++

为什么在成员函数的定义中应该使用inline关键字。而不是声明?

3 个答案:

答案 0 :(得分:10)

inline有一些史前用途,但现在最好记住它说:“这个定义将被定义多次,这没关系。”

也就是说,通常单定义规则禁止函数的多个定义。这样:

// foo.hpp
void foo() { /* body */ }

// a.cpp
#include "foo.hpp"

// b.cpp
#include "foo.hpp"

导致错误,因为foo在两个翻译单元中定义。您可以根据需要随时声明事物。这样:

// foo.hpp
void foo();

// foo.cpp
void foo()
{
    /* body */
}

// a.cpp
#include "foo.hpp"

// b.cpp
#include "foo.hpp"

很好,因为foo定义一次,并且多次声明。 inline做的是允许这样做:

// foo.hpp
inline void foo() { /* body */ }

// a.cpp
#include "foo.hpp"

// b.cpp
#include "foo.hpp"

上班。它说“如果你不止一次看到foo,那就假设它们是相同的并且可以使用它”。

答案 1 :(得分:3)

不,它也可以在成员函数声明中使用。虽然msdn文档不是标准的,但它被提及MSDN inline。请参阅其中的注释部分。

但是,我了解到,尽管明确提到了内联,但现代编译器还是要内联函数。

class foo
{
    inline void methodOne();
};

void foo::methodOne()
{
}

IdeOne Results

此外,可以将声明和定义指定为具有相同的效果。

class foo
{
    inline void methodOne();
};

inline void foo::methodOne()  // Here keyword inline is optional. Needs to be mentioned if method declaration isn't declared inline.
{
}

IdeOne Results

以上两者都会产生同样的效果。

答案 2 :(得分:1)

这是因为它只是编译器将函数体直接放在调用它的位置的线索。因此,编译器查看定义函数的位置是有意义的。因此,如果您在内联函数,则应将实际的函数代码放在类头文件中,如果不这样做,则可能会出现链接器错误。

如果您想了解更多有关内联的信息,请查看:http://www.parashift.com/c++-faq-lite/inline-functions.html