C++中前置声明和头文件包含

转载 2015年12月21日 20:40:24

假设有一个Date类

Date.h

  1. class Date {  
  2. private:  
  3.     int year, month, day;  
  4. };  

如果有个Task类的定义要用到Date类,有两种写法

其一

Task1.h

  1. class Date;  
  2. class Task1 {  
  3. public:  
  4.     Date getData();  
  5. };  

其二

Task2.h

  1. #include "Date.h"  
  2. class Task2 {  
  3. public:  
  4.     Date getData();  
  5. };  

一个采用前置声明,一个采用#include<Date.h>加入了Date的定义。两种方法都能通过编译。但是 Task1.h 这种写法更好。如果Date.h 的 private 成员变量改变,比如变成 double year, month, day; ,Task1.h 不需要重新编译,而 Task2.h 就要重新编译,更糟的是如果 Task2.h 还与其他很多头文件有依赖关系,就会引发一连串的重新编译,花费极大的时间。可是事实上改变一下写法就可以省去很多功夫。所以能用前置声明代替#include 的时候,尽量用前置声明


有些情况不能用前置声明代替#include

比如Task1.h改成

  1. class Date;  
  2. class Task1 {  
  3. public:  
  4.     Date d;  
  5. };  

会编译错误,因为Date d定义了一个Date类型变量,编译器为d分配内存空间的时候必须知道d的大小,必须包含定义Date类的Date.h文件

这是可以采用指针来代替

  1. class Date;  
  2. class Task1 {  
  3. public:  
  4.     Date *d;  
  5. };  

指针的大小是固定的。在32位机上是4字节,64位机上是8字节。这时编译Task1的时候不需要Date的大小,所以和Date的定义无关。

上述例子可以说明

如果使用object reference 或 object point 可以完成任务,就不要用object

这样可以尽最大可能避免#include

为声明式和定义是提供不同的头文件 

在函数库的设计过程中,接口的设计就要遵循上述准则。

一个接口的头文件是这样的

interface.h

  1. class Date;  
  2. class Address;  
  3. class Email;  
  4. Date getDate();  

如果客户只用到Date类,编译器就只会去编译Date.h,而不去编译Address.h,Email.h 等等文件。


究竟什么时候需要前置声明,什么时候需要头文件包含呢?

      头文件包含其实是一想很烦琐的工作,不但我们看着累,编译器编译的时候也很累,再加上头文件中常常出现的宏定义。感觉各种宏定义的展开是非常耗时间的,远不如自定义函数来得速度。我仅就不同头文件、源文件间的句则结构问题提出两点原则,仅供参考:

  第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。

  第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并编译成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非在声明部分(H文件)包含。


C++中头文件相互包含与前置声明

一、类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,...
  • wjs1033
  • wjs1033
  • 2016年04月22日 12:01
  • 373

【总结】C++前置声明

总结来说: 1)降低模块的耦合。因为隐藏了类的实现,被隐藏的类相当于原类不可见,对隐藏的类进行修改,不需要重新编译原类。 2)降低编译依赖,提高编译速度。指针的大小为(32位)或8(64位),X发...
  • qq_37660535
  • qq_37660535
  • 2017年06月09日 15:07
  • 129

【C++学习与应用总结】2: 关于类型前置声明

本文总结了c++中前置声明的写法及注意事项,列举了哪些情况可以用前置声明来降低编译依赖。...
  • elloop
  • elloop
  • 2015年12月04日 07:51
  • 5362

关于C++中的前置声明

今天一朋友问及C++中的前置声明问题,下面是我给出的回答。   在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类...
  • imxiangzi
  • imxiangzi
  • 2015年10月27日 20:08
  • 989

C++类前置声明解决类之间互相包含的问题

作者:朱金灿 http://blog.csdn.net/clever101       类的前置声明(forward declaration)和包含头文件(#include)的区别常...
  • hewei0241
  • hewei0241
  • 2014年05月02日 21:49
  • 1258

c++之类的前置声明

        原创文章,转载请注明出处,谢谢!               作者:清林,博客名:飞空静渡 刚开始学习c++的人都会遇到这样的问题:定义一个类 class A,这个类里面使用了类B的对...
  • fjb2080
  • fjb2080
  • 2010年04月27日 12:36
  • 5340

关于前置声明与C++中头文件相互包含的几点问题

一个前置声明是指在程序员尚未给出完整定义之前对一个标示符(一个类型、一个变量或者一个函数)的声明。一个很简单的例子就是我们在函数A中使用了函数B,但是函数B的声明在函数A之后,这个时候,就需要对函数B...
  • u011676589
  • u011676589
  • 2014年04月12日 09:56
  • 828

C++中前置声明和头文件包含

假设有一个Date类 Date.h [cpp] view plaincopy class Date {   private:       ...
  • EmSoftEn
  • EmSoftEn
  • 2015年12月21日 20:40
  • 3477

类前置声明和头文件包含

类的前置声明(forward declaration)和包含头文件(#include)的区别常常会迷惑我们,特别是涉及两个类相互包含的时候。因此我们有必要搞清楚二者的区别以及二者的适用场合。  ...
  • wl_fln
  • wl_fln
  • 2014年03月18日 19:18
  • 694

[C++]前置声明和头文件

假设有一个Date类 Date.h [cpp] view plain copy class Date {   private:      ...
  • erzr_zhang
  • erzr_zhang
  • 2016年10月14日 00:27
  • 131
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中前置声明和头文件包含
举报原因:
原因补充:

(最多只允许输入30个字)