上一篇简单介绍了一下源码文件。这篇我们开始对每行进行详细介绍。
从main.cpp文件开始。代码如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "widget.h" 是把widget.h这个头文件包含进main.cpp文件中。头文件简介看这里。
#include <QApplication> 是把QApplication这个文件包含进来,在QtCreator中按F2跟踪这个QApplication,发现QApplication文件里面只有1行#include "qapplication.h",也就是说实际include进来的文件是qapplication.h。
需要注意的是,代码第一行是#include "xxxx" 形式,第二行是#include <xxxx>形式,一个采用双引号,另一个采用尖括号,二者有什么区别呢?区别主要是编译器在预处理文件时的头文件查找目录不同。#include "xxxx" 是在本工程内查找xxxx文件,即main.cpp所在的目录内查找;#include <xxxx>是在开发环境的系统目录内查找xxxx文件。这里系统目录默认为“D:\Qt\Qt5.9.1\5.9.1\mingw53_32\include\模块目录”,在.pro文件中添加了QtWidgets模块,目录为“D:\Qt\Qt5.9.1\5.9.1\mingw53_32\include\QtWidgets”。进入QApplication文件后再#include 某个文件就视为在QApplication工程下的#include ,因此#include 就用双引号,即#include "qapplication.h"。
第4行起,到最后一行,整个是main函数。main函数是整个程序的入口,也就是启动的地方,上一篇文章提到过。换句话说,程序开始运行时,操作系统首先要找到程序的main函数,然后才能开始下一步工作,不管我们的程序有多花哨的功能,main函数是少不了的,而且名字也必须是这4个字母,不能改变。
说了这么多main函数,那么什么是函数呢?英语里面叫function,而function另一个意思作用“功能; 职能; 机能;”。我认为函数就是具有一定功能的一段代码。为了便于使用,得给它起个名字,这个名字叫做函数名,这样只要我们在代码中写上这个函数名,计算机就知道我们要用这个功能,通过这个函数名找到这段代码。计算机找到函数名后就一行一行顺序执行函数名后面的代码,但是它并不知道功能代码到哪结束,因此需要用一对花括号{ }把这段功能代码包裹起来,这样计算机就知道到运行到哪一行时函数就结束了,这对花括号连同里面的代码叫做函数体。
函数除了要有函数名和函数体外,多数函数还要有参数和返回值。参数就好比炒菜时要用的食材和工具,返回值就是炒出来的菜。在C++函数中,参数一般写在函数名后面,用圆括号括起来,返回值写在函数名前面,注意这里“参数”和“返回值”实际应该叫做参数类型和返回值类型。(类型是指数值类型,下篇再说)比如我设计了一个炒红烧肉函数:
红烧肉 炒红烧肉(五花肉,各种调料)
{
将五花肉洗净
锅里加适量的水烧热后,放入五花肉煮到肉颜色变浅;
捞起五花肉,切块备用;
锅里加入油,然后加入蒜瓣和姜片煸炒;
炒出香味后,倒入五花肉快煸炒至肉块微微出油;
然后倒入一大碗温水;
加入老抽,生抽,八角,花椒,红曲粉一起煮;
盖上锅盖小火焖上40分钟左右;
收汁,翻炒均匀,装盘;
return 红烧肉;
}
函数名就叫“炒红烧肉”,原料是五花肉和各种调料,也就是参数类型是五花肉、调料,别的肉不行,不然做出来的就不是红烧肉那味儿了;炒好之后给我的应该是红烧肉,也就是返回值类型必须是红烧肉,要是最后端上一份水煮肉片,那也不行。所以抽象一下就是
返回值类型 函数名(参数列表)
{
函数体
}
有的函数没有参数,比如,我需要一个暂停函数叫pause5s,功能是当我调用它时程序暂停5秒,其他什么动作都不做,这不需要任何参数,调用到它时程序就暂停运行5秒钟。但是返回值一定要有,就算刚才的那个pause5s没有返回任何有用的东西,也需要有一个void的返回值类型。void表示返回值类型为空,即如下形式:
void pause5s()
{
暂停5秒钟;
}