第二章:对象的创建与使用 (2) (利用C++标准库创建对象)

在我们进行编程的时候,并不需要每次都从零开始构建一个程序,往往我们可以使用一些由其他人或者先前的工程师进行精心测试过得代码来快速构建我们自己的程序,这样我们可以节省很多很多的时间和精力,同样在大多数情况下其性能也会出色很多。而在C和C++当中通过调用库函数来实现这一点。所谓库即是由别的公司或者个人将它们编写测试好的代码进行编译之后得到的一个或多个文件,这些文件当中含有的函数可以由连接器连接到用户所编写的程序当中去。而由于库中往往含有多个函数和变量,用户去一一声明自己所使用到的函数将会十分麻烦,然而C和C++当中的“头文件”很好的解决了这个问题,即函数库的提供者同时提供一份头问件,其中包含用户可以使用的所有的变量及函数的声明,如此一来用户只需要使用#include预处理器命令将对应文件插入到用户所需的地方即可,从而免去了用户繁杂的声明工作。

对于#include预处理器命令,有些值得注意的地方:首先双引号和尖括号包含文件名有着不同的意义。尖括号表示预处理器以特定的方式来寻找文件,一般是环境目录中或者编译器命令行中指定的某种路径,具体寻找路径跟随机器、系统、编译器不同而不同,而双引号则表示从当前目录开始寻找,如果没有找到则再按照尖括号的形式来寻找。

#include <header.h>

#include “header.h”

关于标准库中头文件的引用,在早期不同的编译器厂商选用了不同的扩展名,而后为了增加源代码的可移植性,则使用了一种标准引用,去除了扩展名,比如

#include <iostream>

而从C语言继承下来的库则可以去除文件后缀后在开头加入字母”c”。即

#include <cstdio>

#include <cstdlib>

当然传统的后缀包含法依然可用。只不过两种引用方式稍有不同,对于标准C++库来说

#include <iostream.h>

相当于

#include <iostream>

using namespace std;

如果使用新式的引用方式,则必须显式声明使用名字空间std(“standard”之意)名字空间为C++为了解决C语言当中程序规模庞大后的函数以及变量命名困难问题,即将函数包含进名字空间,使用某个名字空间中的函数时需要在函数或变量名前边加上作用域解析符(“::”双冒号),比如:

std::cout << “hello” << std::endl;

当然也可以使用using namespace std;使得以下的语句等同于上边这条语句。

cout << “hello” << endl;

当然如果只是想单独不加作用域解析符使用其中一个函数或变量,则可以:

using std::cout;

cout << “hello” << std::endl;

当然在使用名字空间的时候尽量在源代码文件当中使用,不要将其包含在头文件当中,因为在头文件当中包含using的话会导致所有引用这个头文件的源代码都出现混乱。很可能造成编译失败或者难以发现的函数及变量调用错误。

对于字符串输出这里,C的预处理器对长字符串做出了一些优化,即它可以将相邻的几个字符串拼接成为一个长字符串,于是在输出长文本时我们不必将其完全写在一行当中,比如:

std::cout << “Hello World “

“I feel good \n”;

以下为C++标准库当中一些头文件的简单介绍:

Reference-C

图片来源:http://www.cplusplus.com/reference/

其中最常用的莫过于标准容器库,所谓容器,其介绍如下:

A container is a holder object that stores a collection of other objects (its elements). They are implemented as class templates, which allows a great flexibility in the types supported as elements.

The container manages the storage space for its elements and provides member functions to access them, either directly or through iterators (reference objects with similar properties to pointers).

参考来源:http://www.cplusplus.com/reference/stl/

这段话的含义是:容器是储存其他对象(它的元素)的东西,他们使用具有对类型兼容性很高的模板类来实现。容器管理元素存储所需空间并且提供操作访问它们的函数,当然也可以通过直接访问和迭代器访问(一个和指针类似的指向性类)

根据我的理解,容器即是一个可以容纳几乎任何类型数据的管理器,它将我们平时使用的存储模型(向量存储,链表存储,图存储,堆栈,队列等)进行了模板化处理,并且提供了标准的操作函数,还有标准的访问工具(迭代器)这样让我们可以在开发程序的时候不用太在意如何去实现这样一个模型,去考虑更多更高层面的问题,而且标准库中提供的实现会更加严谨全面和高性能。而且所有的容器都可以自动的管理分配存储空间,比如向量容器,与我们使用的数组十分相似,但是其可以在数组大小将尽的时候自动扩展数组上限以容纳更多元素。

总之,学会基本语法以及如何使用标准函数库之后,就可以做出属于自己的第一份C++代码了,书中有详细的模板使用方法,并给出了很多样例代码,(主要以vector即向量模板为例)可以参照它做出自己的第一个C++程序,万事开头难,至此便启程C++之旅。