第2小节:include
#include <iostream>
#include <cstdlib>
这两行代码,用于让本源文件可以包含“iostream”和“cstdlib”两个头文件。为什么源文件需要包含头文件呢?这得先从C++里“头文件”和“源文件”的区别说起。
|
头文件:用于“声明”一些功能,数据。
源文件:用于真正“实现”功能,定义数据。 |
对于C++,头文件扩展名通常为: .h、.hpp、.hxx。其中C++标准库的头文件,则干脆没有扩展名,如何上述代码中的
iostream 和 cstdlib。对于C++,源文件的扩展名通常为cpp。
怎么理解“声明”和“实现”二者呢?简单的说,这有点像“名片”和“真人”的关系。
“名片”,表明有一个人,但它并不就是真的那个人(真的人有血有肉,而它只是一张纸)。
“名片”,它表示你通过它,可以找到某个人,但这只是“可能”,因为如果名片上的内容有误,或者那个人挂掉了,那么就找不到指定的那个人。
“名片”,它往往指出它所代表那个人的职务或功能。比如是一个程序员,或者是一个程序员的老板。如果是前者,通过名称,你应该可以找到一个程序员,
并由他而获得“写程序”的功能;如果是后者,那你可以获得对前者“指手划脚”的功能。
“名片”,有些人需要,有些人不需要。事实上,多数程序员是不需要名片的,而老板,则很需要。
对于程序来说,“声明”表示存在某个“数据”,“数据”可以是一个变量,一个函数,或者一个类。这些我们后面讲。这个数据往往要被其它代码所使用
,正确情况下,这些数据必须存在。
和“名片”不同地方是:名片往往着写着一个人的实际地址;而代码中的“声明”,则只表示“应该有这样一个数据”,并不负责标出这个数据到底定义在哪里,那么,谁负责找到这个数据呢?这就是链接器做的事,如果链接无法找到这个数据,就会报错。
假设我具备疏通下水道的功能,那么我就可以印上100张名片,上面写着“专业疏通下水道”,然后上街趁城管不在时,使劲分发给路人。“名片”取到了向他人声明我具备某某能力的作用;而“真人”,也就是我的肉身,(通过学习或锻炼)实现了我所声明的能力。
如果没有名片,那么我站在大街上,也不过“泯然众人矣”,又有哪位知道我身怀疏通下水道的绝技呢?我的本事只够捣鼓自家马桶;相反,有了名片,那些有“潜在”需求的客户,就可以在必要的时候,联系我过去帮忙(生活自足可无忧矣!)。
因此,源文件“包含”了一些“头文件”,就相当于一个人索要了他人名片,以备以后“调而用之”。
事实上,“头文件”是一个“名片集”,因为在头文件里,往往并不仅仅声明一个“数据”,而是同时声明了一组数据(这些数据一般互有关联)。就像收集了某个公司
所有的名片。这样做,对于要访问这个公司的客户,有它的方便之处,是不是?
我们写程序,不可能所有功能都自己实现。C++已经积累了大量的功能代码;因此,我们总是需要在自己写的代码里,去“包含”种种头文件。以本工程为例,虽然这是一个很简单的程序,但也至少用到“向控制台输出”和“暂停”这两个功能;二者的头文件正是前述的“iostream”和“cstdlib”。
|
iostream
-- i/input/输入;o/output/输出。表示输入输出流。
cstdlib
-- c 表示它来自C++的前身C语言的头文件,std 表示“标准/standard”。lib 则是“库”的英文单词缩写。
|
一句话,如何拿到你要的代码的名片呢?写上“#include”,然后空格,再写上代码的头文件名。
#include 代码文件名称
有同学会问,我怎么知道要用到头文件是什么名称呢?例如:你想用程序删除你电脑上的某个文件,那“删除指定文件”这一功能所在的头文件是哪个呢?
我们今天只是“第一感受”。以后专门讲到头文件时,会对这个问题做出回答。
|
“包含”,是对“include”的字面直译。在某些语言里,该术语或称为“引用”或“导入”。“引用”在意义上更贴切,但C++语言里,“引用”另有其意。
至于“导入”(Java采用这一词),和“包含”类似,有些歧义。且记:事实上,那些代码只是被“借用”了,并没真正被“导入”到当前源文件里。我的意思是:假设已经有源文件A
include 头文件B,那么,此时又有源文件C include 头文件B,则该行为并不会引起程序文件变大。 |
作业:
- 在代码前面部分增加新的include语句:
#include <string>
然后,在代码中原来输出“Hello World!” 和 “system("pause")”两行间加入新行:
std::string msg =
"张三"; //可以换成您的尊姓大名
msg = "你好," + msg + "
!";
std::cout << msg <<
std::endl;
编译并执行程序,看看结果。