• 前置声明和头文件


    假设有一个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的定义无关。

    何时可以用前置声明代替#include

    http://blog.csdn.NET/rogeryi/archive/2006/12/12/1439597.aspx

    上述例子可以说明

    如果使用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 等等文件。

  • 相关阅读:
    linux redis 安装和链接,,,
    ppt转化pdf
    跨服务器 同步数据
    字典表相关
    代码重构,空间换时间,dictionary 不要用object ,需明确指定类型
    stringbuilder for test performance 性能 update 性能
    nvarchar 和varchar 在len下一致,datalength下nvarchar翻倍
    android GradLayout实现计算器
    屏幕录制GIF动画工具
    android SharedPreferences 简单的数据存储
  • 原文地址:https://www.cnblogs.com/wlzy/p/6052738.html
Copyright © 2020-2023  润新知