一、编写自己的头文件
多个文件组成的程序需要一种方法连接名字的使用和声明,在C++中这是通过头文件实现的。C++支持所谓的分别编译(separate compilation),把程序分成独立的逻辑块。因此我们可以把一个类的定义放在一个头文件(.h),而把他的定义成员函数放在单独的源文件中(.cpp),任何使用该类的源文件都必须包含该类的头文件。在编译和连接多个源文件的过程中,编译器会自动根据头文件的找到相应的变量和函数的定义。
二、关于const对象定义在头文件中
在C++中,有些地方需要放置常量表达式,如枚举成员的初始化必须是常量表达式。一般来说常量表达式在编译时编译器就能够计算出结果的表达式。而const变量要成为常量表达式,初始化必须为编译器可见。为了能够让多个文件使用相同的常量值,一般都把这样的const变量定义在头文件中。这种行为有一个很重要的含义:当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const常量,其名称和值都一样。必须要在头文件中用常量表达式初始化,否则在源文件中定义。
三、预处理器
C++的预处理器在处理程序的源代码,在编译器之前运行。#include指示接受一个参数:头文件名。预处理器用指定的头文件的内容代替每个#include。头文件经常需要其他的头文件,而且必须要避免多重包含,这个在前一次已经提到过。利用头文件保护符和预处理器变量的定义,可以使头文件不会被其他的头文件包含,避免难以理解的编译错误。
四、标准库类型
4.1.命名空间namespace
命名空间namespace是C++标准引入的关键字用于控制标识符(包括符号常量、变量、宏、函数、结构、枚举、类和对象等)的作用域,将这些标识符进行本地化,防止命名冲突。如果没有命名空间,则所有标识符都会处于全局空间中,在大型项目的程序开发中很容易出现命名冲突,包括标识符都处于全局空间以及程序使用两个或者多个第三方库的情况等等。
4.2迭代器iterator
迭代器类型和迭代器的区别:迭代器类型如vector<int>,而迭代器是指一种类型支持一组确定的操作(这些操作可以用来遍历整个容器的元素,并访问这些元素),称为迭代器。const_iterator,该类型只能用于读取容器内元素,但不能改变其值。我们对普通的iterator类型解引用时,得到对某个元素的非const引用,而如果对const_iterator类型解引用时,则可以得到一个指向const对象的引用。