一、声明与定义的区分:
一个声明就是一个定义,除非 :
声明:引入名称
定义:引入实体
1. 它声明了一个没有详细说明函数体的函数
2. 它包含一个 extern 定义符且没有初始化函数或函数体
3. 它是一个包含在一个类定义之内的静态类数据成员的声明,它必须在最终程序的某处准确的定义一次
4. 它是一个类名声明,如 class test;
5. 它是一个 typedef 声明。
一个声明就是一个定义,除非 :
声明:引入名称
定义:引入实体
1. 它声明了一个没有详细说明函数体的函数
2. 它包含一个 extern 定义符且没有初始化函数或函数体
3. 它是一个包含在一个类定义之内的静态类数据成员的声明,它必须在最终程序的某处准确的定义一次
4. 它是一个类名声明,如 class test;
5. 它是一个 typedef 声明。
言外之意:
1 。类的声明也就是定义
2 。同时赋初值的声明也就是定义,如 int a=2;
3 。类非静态数据成员的声明也就是定义???
4 。类的所有成员函数的声明也就是定义
1 。类的声明也就是定义
2 。同时赋初值的声明也就是定义,如 int a=2;
3 。类非静态数据成员的声明也就是定义???
4 。类的所有成员函数的声明也就是定义
一个定义就是一个声明,除非:
1. 它定义的是一个静态数据成员
2. 它定义了一个非内联成员函数
1. 它定义的是一个静态数据成员
2. 它定义了一个非内联成员函数
内部连接和外部连接:
编译时每个文件会被编译成一个含有必要信息的源文件 ( 又叫编译单元 ) ,然后编译单元会联结成一个和族文件同名的 .o 文件, .o 文件把不同的编译单元中产生的符号联系起来,构成一个可执行文件。有两种截然不同的链接:内部的和外部的,将这些编译单元联系起来。
内部连接:对这个定义的访问被局限在当前编译单元,其他编译单元无法访问。
外部连接:可被其他单元访问,因此名称在整个执行文件中必须唯一。
类的定义(同时也是声明), enum , struct ,都是内部连接,内联函数,静态的非类成员数据也是
typedef 声明的类型也是内联结。
编译时每个文件会被编译成一个含有必要信息的源文件 ( 又叫编译单元 ) ,然后编译单元会联结成一个和族文件同名的 .o 文件, .o 文件把不同的编译单元中产生的符号联系起来,构成一个可执行文件。有两种截然不同的链接:内部的和外部的,将这些编译单元联系起来。
内部连接:对这个定义的访问被局限在当前编译单元,其他编译单元无法访问。
外部连接:可被其他单元访问,因此名称在整个执行文件中必须唯一。
类的定义(同时也是声明), enum , struct ,都是内部连接,内联函数,静态的非类成员数据也是
typedef 声明的类型也是内联结。
非内联成员函数(包括静态成员)有外部连接,非内联函数,非静态自由函数(非类的成员函数)也是外连接。
声明只对当前编译单元有用,他们不会影响到
.o
文件,
.h文件,由于该文件会被其他.cpp文件包含,但由于声明只是对当前编译单元有效,是不会将符号引入.o文件,所以该文件不能含有任何外部连接的符号(数据成员和函数)的定义。一般情况下也不要包含内连接符号的定义。
综上所诉:
.h文件中能包含:
1。类成员数据的声明,但不能赋值
1。类成员数据的声明,但不能赋值
2.类静态数据成员的定义和赋值,但不建议,只是个声明就好。
3。类的成员函数的声明
4。非类成员函数的声明
3。类的成员函数的声明
4。非类成员函数的声明
5.常数的定义:如:const int a=5;
6.静态函数的定义
7.类的内联函数的定义
不能包含:
1. 所有非静态变量(不是类的数据成员)的声明
2。 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在.h文件中使用std::string