“
声明是一种“把一个c++名称引入或者重新引入到你的程序”的构造。一个声明也可以是一个定义,这取决于他所引入的是哪些实体以及如何引入这些实体的:
1.名字空间和名字空间别名:名字空间的声明和名字空间的别名通常都是定义,尽管“定义”这个概念在此的含义比较特别,因为名字空间的成员列表在以后还是可以进行扩展的。
2.类、类模板、函数、函数模板、成员函数和成员函数模板:当且仅当这个声明包含一个与声明的名称相关联的花括号体时,该声明才是定义。这条规则同样也适用于:联合、运算符、成员运算符、静态成员函数、构造函数、析构函数和与上面相对应的模板版本的显示特化。
3.枚举:当且仅当该声明包含一对花括号内的枚举子时,该声明才是定义。
4.局部变量、非静态成员变量:这些实体总是可以被看作定义,尽管对他们而言,声明和定义的区别几乎不会产生任何影响。
5.全局变量:如果声明前面没有直接用关键字extern,或者它具有一个初始化器,那么,这个全局变量的声明就是该变量的定义;否则就不是一个定义。
6.静态成员变量:当且仅当这些实体出现在“包含他们的类或者类模板”的外部时,该实体的声明才是定义。
7.typedefs、using-declarations和using-directive:他们不能成为定义,尽管typedef可以组合类或者union的定义。
8.显示实例化指示符:我们把它当作定义来对待。
”
以上这一段摘自《C++ Templates中文版》 附录A“一处定义原则”第2节“声明和定义”
希望对大家有所帮助