头文件中的内容
头文件一般包含类的定义、extern变量的声明和函数的声明。
切记:头文件中不要包含变量定义,否则极可能导致重复定义的连接错误。例如下列定义就不推荐包含在头文件中:
extern double val1 = 0.1;//定义
double val2;//定义
对于头文件不应该含有定义这一规则,有三个例外:头文件可以定义类、值在编译时
就已经知道的const对象和inline函数。之所以需要在头文件中定义这三类例外,是因为编译器需要他们
的定义(而不是声明)来产生代码。例如:为了产生能定义或使用类的对象的代码,编译器需要知道组成该类
的数据成员。
对于const变量需要区分,如果const变量不是用常量表达式初始化,它就不应该在头文件中定义,
它应该在一个源文件中定义并初始化,应在头文件中为它添加extern声明,以使其能被多个文件共享。
当const变量是通过常量表达式初始化时,一般都把这样的const变量定义在头文件中。例如下列使用代码:
//A.h
extern const int var;
//A.CPP
#include "A.h"
const int var = sqrt(2.0);
//Another.h
const int var = 2;
头文件中的库包含
头文件中包含标准库引用时,应当使用完全限定的标准库名字而不使用using 声明。因为如果在头文件中使用using声明,相当于包含该头文件的每个程序都放置了统一using,不论该程序是否需要该using声明。下例中头文件推荐使用B.h的写法
//A.h
#include <string>
using std::string;//err 在头文件中使用using 声明
class A
{
private:
string var;
//........
// B.h
#include <string>
class A
{
private:
std::string var;
//........
};