C++中的前置声明

一般来说,当你某个文件中,需要用到某个类或者结构体的指针,但是却不能直接包含那个类或者结构体的声明文件时,可以用前置声明解决。

前置声明是指对类、函数、模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义。在很多场合我们可以用前置声明来代替#include语句。类的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小,成员等具体内容。在未提供完整的类之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。而头文件则一一告之。如:

class Screen;

前置声明,也称前向声明(forward declaration)。在声明之后,定义之前,类Screen是个不完整类型(incomplete type),即已知Screen是一个类型,但是不知道包含哪些成员。

不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。可以通过前置声明配合指针或引用类型声明来减少编译依赖。

前置声明的作用:

  1. 可以减少编译依赖、减少编译时间(如果头文件被修改,会导致多次重新编译);
  2. 可以隐藏细节;
  3. 可以减少类大小(前置声明会告诉这个类的存在,而不用提供类定义的所有细节);
  4. 减少include,防止类间相互引用形成依赖,造成编译不通过.

重点提示前置声明的类或者结构体,在使用时只能声明成指针变量,而且不能使用它的成员。因为声明一个指针变量,编译器能知道这个指针变量的类型,还能知道变量的大小(指针大小),所以能创建这个指针变量。但是如果声明成对象,编译器不知道该对象的成员,故不能为这个变量分配空间,从而会有一个使用未定义类型的错误。

结构体前置申明时,定义的变量只能是指针类型
如果是对象则编译器无法判读结构体大小导致提示使用未定义。

struct st_C;
class D
{
public:
    st_C* c = nullptr;
    D()
    {

    }
    ~D()
    {

    }

private:

};

你可能感兴趣的:(C++,c++,数据结构,开发语言)