进入C++(2)
C++预处理器和iostream文件
下面简要介绍一下需要知道的知识,如果程序要使用C++输入或者输出工具,需要提供这样的两行代码:
#include<iostream>
using namespace std;
可使用其他代码替换第二行,这里使用这行代码旨在简化该程序。
C++和C一样,也使用一个预处理器,该程序在进行主编译之前对源文件进行处理,(有些C++实现使用翻译器程序将C++程序转换为C程序。虽然翻译器也是一种预处理器,但这里不讨论这种预处理器)。不必执行任何特殊的操作来调用该预处理器,他会在编译程序时自动运行。
如:
#include<iostream> //a PREPROCESSOR directive
该编译指令导致预处理器将iostream文件的内容添加到程序中。这是一种典型的预处理操作:在源代码被编译之前,替换或添加文本。
这提出一个问题:为什么要将iostream文件的内容添加到程序中呢?答案涉及程序与外部世界之间的通信。Iostream中的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。C++的输入/输出方案涉及iostream文件中的多个定义。为了使用cout来显示消息,第一个程序需要这些定义。#include编译指令导致iostream文件的内容随源代码文件的内容一起被发送给编译器。实际上,iostream文件的内容将取代程序中的代码行#include<iostream>。原始文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一阶段将使用该文件。
注意:使用cin和cout进行输入和输出的程序必须包含头文件iostream。
头文件名
像iostream这样的文件叫做包含文件(include file)——由于它们被包含在其他文件中,也叫做头文件。
C++编译器自带了很多头文件,每个头文件都支持一组特定的工具。C语言的传统是,头文件使用扩展名h,将其作为一种通过名称标识文件类型的简单方式。例如,头文件math.h支持各种C语言数学函数,但C++的方法变了。现在,对老式C的头文件保留了扩展名h(C++程序仍可以使用这种文件),而C++头文件则没有扩展名。有些C头文件被转换为C++头文件,这些文件被重新命名,去掉了扩展名h(使之成为C++风格的名称),并在文件名称前加上前缀C(表明来自C语言)。例如,C++版本的math.h为cmath。有时C头文件的C版本和C++版本相同,而有时候新版本做了一些修改。对于纯粹的C++头文件(如iostream)来说,去掉h不只是形式上的变化,没有h的头文件也可以包含名称空间。
名称空间
如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用:
using namespace std;,
这叫做using编译指令。最简单的办法是,现在接受这个编译指令。
名称空间支持是一项C++特性,旨在让你编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,他还有助于组织程序。一个潜在的问题是,可能使用两个已封装好的产品,而它们都包含一个名为wanda()的函数。这样,使用wanda()函数时,编译器将不知道指的是那个版本。名称空间让厂商能够将其产品封装在一个叫做名称空间的单元中,这样就可以用名称空间的名称来指出想用那个产商的产品。因此,Microflop Industries可以将其定义放到一个名为Microflop的名称空间中。
按照这种方式,类、函数和变量便是C++编译器的标准组件,他们现在都被放置在名称空间std中。仅当头文件没有扩展名h时,情况才是如此。这意味着在iostream中定义的用于输出的cout变量实际上是std::cout,而endl实际上是std::endl。因此,可以省略编译指令using,以下述方式进行编码:
Std::cout<<”Come up and C++ me some time.”;
Std::cout<<std::endl;
然而,多数用户并不喜欢将引入空间之前的代码(使用iostream.h和cout)转化为名称空间代码(使用iostream和std::cout),于是,using编译指令应运而生。
这个using编译指令使得std名称空间中的所有名称都可用。
使用cout进行C++输出
现在看一看如何显示消息。
Cout<<”this is an apple”;
双引号括起的部分是要打印的消息。在C++中,用双引号括起的一系列字符叫做字符串,因为他们是由若干个字符组成的。<<符号表示该语句把这个字符串发送给cout;该符号指出了信息流动的路径。cout是一个预定义对象,知道如何显示字符串、数字、和单个字符等。
从概念上看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。