在头文件中声明class 类 与 include类所在的头文件的理解:

在头文件中,声明类

它告诉编译器:存在这样的类。而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元
中。没有这个类原型,编译器将不会让我们编译通过。

在头文件中引用 类所在的头文件,

区别和结果:

引用class声明和引用class头文件都可以编译通过!

引用class声明显得简洁,一目了然,不用将其头文件都加载;

但是在对应的实现的.cpp文件中,必须要引入class所在的头文件,因为这样在cpp文件中才能找到对应的class的具体实现地方;

在头文件中引用class所在的头文件,就不必在对应的cpp文件中引用用到的类的头文件了。

哪个方法更好?没有研究过,

本人菜鸟一枚,以此记录一下,以便以后提醒自己。

今天通过读书,看到这段话!

提醒自己以后还是用前置声明的好!

private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPustiButton *findButton;
QPushButton *closeButton;

对于这些私有变量,我们使用了它们的类前置这是可行的,因为它们都是指针(必须是类的指针才可以,如果是类的声明,那么会调用成员类的构造函数的,如果有参数,需要传入成员类的构造参数,没有参数,则调用构造函数),而且没
有必要在头文件就去访问它们,因而编译程序就无须这些类的完整定义。我们没有包含与这几
个类相关的头文件(如<QCheCkBÿX> 、<QLabel> ,等等),而是使用了一些前置声明,这可以使编译
过程更快;

在filedialog.h 文件中,本可以仅简单地添加一个<QtGui>包含即可,而不用包含<QDialog> 和
使用QCheckBox、QLabel、QLineEdit和QPushButtion的前置声明。然而,在一个头文件中再包含一个
那么大的头文件着实不是一种好的编程风格,尤其对于比较大的工程项目更是如此。

关于私有变量是指向类的指针,还是类的声明,下面两端代码说明:

#include "stdafx.h"
#include <string.h> class A;
//class B
//{
//public:
// B(){ printf("B constructor\n");}
// A a;
//}; class D
{
public:
D(){ printf("D constructor\n");}
}; class C
{
public:
C(){ printf("C constructor\n");}
A *a;
D d;
}; class A
{
public:
A(){ printf("A constructor\n");}
}; int _tmain(int argc, _TCHAR* argv[])
{
//B b;
C c;
getchar();
return ;
}

一:B类运行错误,因为B类中含有类A,类A a,不是指向类的指针,需要找到A的具体实现,需要调用A的构造函数,即使在class B中前置声明类A,也是不可以的,

前置声明,只是说明了这些类存在,而没有访问它们的完整定义;如果把class A定义放到B类定义之前,那么B类是可以编译通过的;

二:A类虽然在C类之后定义,但是C类依旧运行成功,因为C类中声明的是指向类A的指针,并没有调用类A的构造函数;

成员变量 类D,则调用了D的构造函数

三:注意哦,如果有类成员变量(非指针),那么是先调用类成员变量的构造函数的,那么也就是如果类成员变量构造函数需要参数,那需要写在 类的初始化列表中

在头文件中声明class 类 与 include类所在的头文件区别---理解的更多相关文章

  1. 类A是公共的,应在名为A.java的文件中声明错误

    第一种!!! “类A是公共的,应在名为A.java的文件中声明”这句话需要分两步来理解: 1.如果类A被声明为公共的(public),那么必须将类A保存在名为A.java的文件中: 2.反之,在一个文 ...

  2. Java入门-类HelloWorld是公共的,应在名为HelloWorld.java的文件中声明

    开始学习java了,搭好环境,notepad++中新建一个java文件,新建一个HelloWorld类, public class HelloWorld { public static void ma ...

  3. 报错:①Tog goal specified requires a project to execute but there is no POM in this directory......②说类HelloWorld是公共的, 应在名为 HelloWorld.java 的文件中声明 public class HelloWorld......

    在运行Maven的命令时,在DOS窗口里面必须把目录切换到项目的根部,要不然命令是找不到目的地. 下图是错误示范,项目在Demo02这个目录里,就必须将目录切换到Demo02下,否则DOS窗口只有飘红 ...

  4. 多个".h"文件中声明及定义 全局变量和函数

    一.".h"文件必须以如下格式书写 例:文件<CZ_efg_hi.h"> ------------文件内容----------- #ifndef CZ_Efg ...

  5. 一个.java文件中是否可以有多个类

    前段时间,有个同事问到我这个问题:一个.java文件中是否可以有多个类? 答案:可以有多个类,但最多只能有一个被public修饰的class. 且若这个.java文件中有一个public类型的clas ...

  6. Shell 从日志文件中选择时间段内的日志输出到另一个文件

    Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...

  7. java算法面试题:编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

    package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...

  8. 一个.java文件中可以有几个同级类

    1.在一个.java文件中可以有几个类.修饰符只可以public abstract final和无修饰符,不能是其他的private等修饰符.2.public修饰的只能有一个,且要与文件名相同 若没有 ...

  9. Java将文件中的内容转换为sql语句(和并发定时读取文件)

    数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...

随机推荐

  1. Python3.x:常用基础语法

    Python3.x:常用基础语法 1,if else语句: 不执行if内的语句,需要用:pass if i>2: #跳过不执行 pass else: print("i= %s" ...

  2. No module named _tkinter

    https://www.douban.com/note/524197380/?type=like

  3. cogs 896. 圈奶牛

    ★★☆   输入文件:fc.in   输出文件:fc.out   简单对比 时间限制:1 s   内存限制:128 MB 描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必 ...

  4. Ansible Playbooks 常用模块

    官网链接:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html ansible python module ...

  5. JavaConfig 使用Java代码进行显示配置

    从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中. 需要先加载spring-context 包 &l ...

  6. Android 图形基础类Rect,扎实基础助腾飞

    转载请注明出处:王亟亟的大牛之路 上周把"垃圾桶动画写完了",然后这礼拜寻思着学习点啥,脑子闷逼了大半天,然后就找了点基础源码读读,把看的经历分享给大家. 先安利:https:// ...

  7. JAVA多线程本质分析

    多线程是Java开发中的重中之重,其重要性和难度,可见一斑.掌握并精通多线程开发,是每一个程序员的必修之课.哪怕中间的过程很痛苦,只要坚持了,并最终豁然开朗了,都是一种升华. 多线程的优化:合理利用C ...

  8. spark SQL学习(spark连接hive)

    spark 读取hive中的数据 scala> import org.apache.spark.sql.hive.HiveContext import org.apache.spark.sql. ...

  9. [小问题笔记(三)] SVN树冲突(Tree Conflict),文件不能提交的解决办法

    传说中SVN的树冲突是由不同开发者删除文件,移动文件神马的造成的. 我们遇到的情况是: 开发人员小B移动了项目中几个文件然后提交.开发人员小L更新项目至最新版本. 获取到移动后的文件则显示文件已被修改 ...

  10. 解决httpclient因为保持永久长连接造成连接吊死的问题

    httpclient使用了连接池,如果没有设置keep-alive策略,PoolingHttpClientConnectionManager会默认使用永久连接. 最近在调用京东api时,发现一个请求开 ...