Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 成员函数定义中的内联关键字_C++ - Fatal编程技术网

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

C++ 成员函数定义中的内联关键字,c++,C++,为什么要在成员函数的定义中使用inline关键字。而不是在声明中?这是因为它只是编译器将函数体直接放在调用它的地方的一个线索。因此,编译器查看函数的定义位置是有意义的。因此,如果你内联函数,你应该把实际的函数代码放在类头文件中,如果你不这样做,你可能会得到链接器错误 如果您想了解有关内联的更多信息,请查看:否,它也可以用于成员函数声明中。虽然msdn文档不是标准文档,但也提到了它。请参阅其中的注释部分 但是,我了解到,尽管明确提到内联函数,但是否内联函数取决于现代编译器 class foo {

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

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


如果您想了解有关内联的更多信息,请查看:

否,它也可以用于成员函数声明中。虽然msdn文档不是标准文档,但也提到了它。请参阅其中的注释部分

但是,我了解到,尽管明确提到内联函数,但是否内联函数取决于现代编译器

class foo
{
    inline void methodOne();
};

void foo::methodOne()
{
}

此外,可以同时指定声明和定义,使其具有相同的效果

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.
{
}


以上两种方法都会产生相同的效果。

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

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.
{
}
也就是说,通常一个定义规则禁止一个函数的多个定义。这:

// 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
,就假设它们是一样的,并接受它”

我不会反对投票,但这种用法是完全错误的。大多数编译器基本上完全以这种方式忽略它;毕竟,谁是程序员来做编译器的工作?因此,我对“线索”这个词的使用非常广泛,毕竟它只是对编译器的一个提示。我的意思是,它甚至不是一个提示,只是在这方面被忽略了。@GManNickG为什么这个“对编译器的提示”的答案如此普遍?对于这种问题,我很少看到像你这样的答案。“对编译器的提示,它可能会忽略,而且无论如何它可能会内联内容”在逻辑上甚至没有任何意义(
inline
在这个上下文中是多余的)。@JBentley:只是时间问题<代码>内联实际上曾经是编译器内联函数的指令,然后编译器变得更聪明了,所以他们只把它当作一个提示,然后他们变得比我们更聪明了,所以他们忽略了它(用于内联)。“提示”视角是“这不做任何事情”(错误)和“这将内联函数”(错误)之间的天然中间地带。现在这种中间立场的方法也是错误的,原因是内联现在是编译器质量的一种行为,而不是语言。