c++时值得向前声明

C++ When worth forward declaration?

本文关键字:声明 值得 c++      更新时间:2023-10-16

我是c++世界的新手,并且了解到向前声明是一种很好的实践。但它总是好的吗?

我正在寻找指导方针,当它是一个很好的做法,使向前声明,当它不是很好,但我真的找不到任何。是否存在使用或不使用它的客观案例,或者这完全取决于开发者?

正如juanchopanza所提到的,一般来说,当您不需要完整的类定义时,可以使用前向声明-基本上是当您不需要知道所讨论的类的大小成员时。它允许您删除编译时依赖项,这可以简化和加速编译。

例如,如果你只使用指向类的指针,那么你就不需要了解该类的更多信息。但是,如果您调用该类的一个方法,或者存储该类的一个实际实例,那么您需要知道该类的全部细节。

class A;  // forward declaration
class B {
    ...
    void func1(A*);
}
class C {
    ...
    A m_inst;
}

在上面的代码中,C不会编译,因为它需要知道A在声明时的大小。然而,func1是好的,因为它只使用指向A的指针,所以不需要知道大小或实现。

Herb Sutter提供了一些信息和解释,但如果你是初学者,请注意其中一些内容有点高级。

在某些情况下,您实际上开始使用不必要的PIMPL习惯用法应用程序(涉及前向声明)来使代码库复杂化,以减少编译时间,而实际上您首先没有任何编译速度问题,至少对于特定的类或头文件是这样。

这可以被认为是过早优化和滥用前向声明的情况。