QT笔记——QT中 class 和 include 包含时的区别 以及QT_BEGIN_NAMESPACE说明
我们经常会使用 include 来包含头文件
#include <QNetworkAccessManager>
#include <QNetworkReply>
改造后:
QT_BEGIN_NAMESPACE
class QNetworkAccessManager;
class QNetworkReply;
QT_END_NAMESPACE
不一样的地方:
class 类名只是声明存在这么一个类,但是通过这个声明无法得到任何关于此类的具体信息。
include头文件则是将整个该头文件与使用到的地方关联起来。
优点:
使用class 类名一般是为了去除编译依赖,减少编译消耗的时
#include “xx.h” 在编译的时候把xx.h文件直接展开,所以里面的接口都能用,可以申明对象。但是classxx;这种方式就不会,你只能使用它的指针或者引用,你不能创建申明对象。
这种方式可以避免当类A和类B互相调用时候产生死循环,并节约编译时间,因为A的头文件中只是使用了B的指针对象,此时并不需要展开类B。
啥时候使用:
你在头文件中只用到一些类的指针(而非实现),那么就可以不包含这些类的头文件,而去使用类的前置声明
例如:
当我们用 class QNetworkAccessManager;时,
我们可以对其使用指针或者引用
QNetworkAccessManager *m_manager;
我们不能QNetworkAccessManager m_manager;否则如下:
在.cpp文件使用了这个指针 或者实例化这个对象 ,我们需要在.cpp文件中包含这个头文件
//这两个是QT的宏
QT_BEGIN_NAMESPACE
QT_END_NAMESPACE
编译之后会展开:(这个是不会加快编译速度的)
namespace QT_NAMESPACE
{
class QNetworkAccessManager;
class QNetworkReply;
}
优点:
这样可以在用户自己定义的命名空间中编译整个Qt程序。
当我们改动类后,不会引发引入大量文件的重新编译。
如果我们不用QT_BEGIN_NAMESPACE和QT_END_NAMESPACE,而是直接声明,那么我们cpp文件中#include相应的头文件时,会出现冲突,因为对于一个类,如QNetworkAccessManager我们声明了两次。
版权声明:本文为lion_cxq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。