当学习完C++的基本语法,想要上手一个大型项目时,必须了解大型项目的文件组织结构。
首先要有脑海里一定要一个概念:一个C++源程序基本上是由3个部分组成:类的定义,类的实现和主函数,与之相对应的,一个大型C++程序通常至少划分为3个文件:类定义文件(*.h)、类实现文件(*.cpp)、类的使用文件(*.cpp,该文件一般包含主函数)。
平时练习的例子比较小,故常常为了方便而将3个部分写在一个同一个文件中。当程序规模较大时,可能要多个源程序文件(也可称为编译单元),而且类也比较多, 而C++规定如果一个编译单元要使用某个类,则必须把类的定义写入源程序中,故当一个类比较复杂或要包含多个类时,工作量和管理问题便出现了,比如当要修改一个类时,如果有100个源文件使用该类,则需要进入每个使用该类的源文件进行修改(Ctrl+c和Ctrl+v要用100次)。
而解决这个问题的方法就是把类的定义写在头文件中,使用该类的源程序要包含该头文件,有时候每个类都要单独写个头文件。把每个文件单独编写、编译、最后在链接,这样当要修改一个类时,只用修改该类的头文件和实现文件即可。
下面举个例子,多文件组织的Car类
文件1:类的定义"Car.h"
class Car {
public:
Car(int x, int y); //构造函数
Car (const Car &p); //复制构造函数
~Car() { count--; }
int getX() const { return x; }
int getY() const { return y; }
static void showCount(); //静态函数成员
private:
int x, y;
static int count; //静态数据成员
};
文件2:类的实现“Car.cpp”
#include "Car.h"
#include <iostream>
using namespace std;
int Car::count = 0; //用类名初始化静态数据变量
Car::Car(const Car &p) :x(p.x), y(p.y) {
count++;
}
Car::Car(int x, int y) : x(x), y(y) {
count++;
}
void Car::showCount() {
cout << " Object count=" << count << endl;
}
文件3:主函数“main.cpp”
#include "Car.h"
#include <iostream>
using namespace std;
int main() {
Car a(4, 5);
cout << "Car A:" << a.getX() << "," << a.getY();
Car::showCount();
Car b(a);
cout << "Car B:" << b.getX() << "," << b.getX();
Car::showCount();
return 0;
}