使用场景上的区别
头文件:变量的声明,函数的声明,宏的定义,类的定义等。
源文件:变量的定义。函数的定义实现,类成员函数的定义实现等。这样方便于我们去管理、规划,更重要的是避免了重定义的问题。
编译期处理方式的区别:
头文件:单个的头文件不参与编译;
源文件:每个源文件,自上而下,独立编译
类中的成员函数在对应的源文件中定义时,一定要加上类名作用域。
//test.h
class CTest {void fun();
};
//test.cpp
void CTest::fun();
注:
- 静态成员属性定义初始化在源文件中,静态成员函数在头文件中声明,在源文件中定义实现要加类名:: , 关键字static去掉。
//test.h static void fun(); //test.cpp void CTest::fun() {}
- 虚函数在头文件中声明,在源文件中定义实现要加类名:: ,关键字virtual需要去掉。纯虚函数不需要实现。
//test.h virtual void fun(); //test.cpp void CTest::fun() {}
- 纯虚函数不需要实现
//test.h virtual void fun() = 0;
- const成员属性在类的构造初始化参数列表中初始化(源文件中),在头文件中声明,在源文件中定义实现要加类名:: , 关键字const保留。
头文件重复包含
- #pragma once:直接告诉编译器这个文件在源文件中只包含一次,相对来说效率比较高。
- 宏判断:#ifndef……#define……#endif
两者的比较:
- #pragma once 直接和编译器沟通,#ifndef基于预处理指令逻辑判断,在大量头文件时,编译速度降低,耗时增加。
- 程序编译的效率速度:#pragma once相对来说更快一些。
- #ifndef:基于逻辑宏判断,在大量头文件时,编译速度降低,耗时增加,宏的名字有一定的概率会重复,导致程序逻辑错误。