在C ++中,构造函数和析构函数可以是内联函数吗?

VC ++使得在类声明内联函数中实现的函数成为可能。

如果我按如下方式声明Foo类,那么CONSTRUCTOR和DESTRUCTOR内联函数是什么?

 class Foo { int* p; public: Foo() { p = new char[0x00100000]; } ~Foo() { delete [] p; } }; { Foo f; (f); } 

定义构造函数的内部INSIDE类与使用“inline”关键字将函数放在类外面的效果相同。

在这两种情况下,这都是编译器的一个暗示。 “内联”function不一定意味着该function将被内联。 这取决于function和其他规则的复杂性。

简短的答案是肯定的。 任何函数都可以声明为inline,并将函数体放入类定义中是一种方法。 你也可以做到:

 class Foo { int* p; public: Foo(); ~Foo(); }; inline Foo::Foo() { p = new char[0x00100000]; } inline Foo::~Foo() { delete [] p; } 

但是,如果它实际上内联函数,则由编译器决定。 VC ++几乎忽略了你的内联请求。 如果它认为这是一个好主意,它只会内联一个函数。 如果使用链接时间代码生成 ,则最新版本的编译器还将内联单独.obj文件中的内容,而不是内联声明(例如,来自不同.cpp文件中的代码) 。

你可以使用__forceinline关键字来告诉编译器,当你说“内联这个函数”的时候,你确实是这个意思,但是这样做通常是不值得的。 在很多情况下,编译器确实知道最好的。

将类中的函数定义等同于用inline关键字标记函数。 这意味着函数可能会或可能不会被编译器内联。 所以我想最好的答案是“也许”?

同样的程度,我们可以任何其他function内联,是的。

内联与否大多由您的编译器决定。 内联代码只对编译器提示。
你可以指望的一个规则是虚拟函数永远不会被内联。 如果你的基类有虚拟的构造函数/析构函数,你的可能永远不会被内联。