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

VC + + 使函数在类声明内联函数中实现。

如果我像下面这样声明了一个类 Foo,那么是否有构造函数和解构函数的内联函数?

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


{
Foo f;
(f);
}
92205 次浏览

定义构造函数 INSIDE 的主体与使用“ inline”关键字将函数 OUTSIDE 放置在类中具有相同的效果。

在这两种情况下,它都是对编译器的提示。“ inline”函数并不一定意味着函数将是内联的。这取决于函数和其他规则的复杂性。

将函数定义放在类主体中等效于使用 inline 关键字标记函数。这意味着该函数可能由编译器内联,也可能不由编译器内联。所以我想最好的答案是“也许”?

简单来说,是的。任何函数都可以内联声明,将函数体放在类定义中是实现这一点的一种方法。你也可以这样做:

class Foo
{
int* p;
public:
Foo();
~Foo();
};


inline Foo::Foo()
{
p = new char[0x00100000];
}


inline Foo::~Foo()
{
delete [] p;
}

但是,如果编译器实际上内联了函数,那就取决于编译器了。VC + + 几乎忽略了你的内联请求。只有当它认为这是一个好主意时,它才会内联一个函数。编译器的最新版本也将内联单独的内容。文件,并且没有在内联中声明(例如,从不同的。Cpp 文件)。

您可以使用 强制上线关键字告诉编译器,当您说“ inline this function”时,您真的是认真的,但是通常不值得这样做。在许多情况下,编译器确实知道得最多。

就像我们可以使任何其他函数内联一样,是的。

内联与否主要由编译器决定。代码中的内联只提示编译器。
您可以依赖的一条规则是,虚函数永远不会内联。如果您的基类有虚构造函数/析构函数,那么您的基类可能永远不会内联。