我一直想知道为什么我读过的大多数代码和教程总是在类中声明成员函数,然后像这样定义它。
class A{
A doSomething();
};
A A::doSomething(){
//doing something
}
而不是这样做
class A{
A doSomething(){
//doing something
}
};
无论如何,我正在修改我的教授的课程,我发现了这个:
“ Toute fonctionmembredéfiniedanssa classe(danslaséclarationdela classe)estconsiéréeparle compilateur comme une fonction inline.Lemotcléinlinen'estplusutilisé。”
转化为;
“其类中定义的所有成员函数(在类'声明中)被编译器视为内联函数。不再使用关键字'inline'”
我理解的是,邻接内联函数就像宏一样工作。编译器将整个代码块复制到调用该函数的每个实例中。
我的问题是;我教授的课程中的陈述是否正确,如果是,那背后的原因是什么?
答案 0 :(得分:9)
你教授的陈述是正确的,你对inline
的含义的理解不是。 inline
函数允许跨翻译单元的多个定义,并不一定意味着调用实际内联(即像宏一样扩展)。
如果您在没有inline
或static
的标头中定义免费功能,并在多个翻译单元中包含该标头,您将打破一个定义规则。
成员函数类似,除非标记为内联(它们隐含在类定义中)。
答案 1 :(得分:3)
关键字inline
并不意味着C ++中的 inline ,它只意味着可以在不同的翻译单元中看到完全相同功能的多个定义一个定义规则。
考虑到这一点,在里面定义了类成员定义的成员函数是隐式内联的。包含该标头的所有翻译单元都可以生成相同的符号,链接器将丢弃除其中一个之外的所有标记。