类定义和类实现的分离
类定义就是指定义类名,类的数据域和类里面的函数。只是定义而不去实现。这一概念有点像是java中接口的概念,是被当做一个约束和标准去使用的。类定义的文件是.h文件。
类实现是指对类定义的具体实现,即完成函数内部的代码。类实现的文件是一个.cpp文件。
类定义和类实现的文件名是一样的,但是扩展名不同。
那么我们为什么要将定义和实现分离?自然是有很多好处的,可以参见下面这篇博客:
我举一个最简单的例子。假如你在做一个很大的项目,每个人负责项目的一个小部分,最后一个部分调用另一个部分的函数,完成整个项目的实现。在这个过程中,你就需要查看别的同事写了什么函数,函数的功能是怎样的。如果我们不把定义和实现分离,阅读量是很大的。但是分离之后,我们只需要看类定义(.h文件)即可知道这个类有什么函数。对于函数的功能,我们可以通过阅读注释来获得。所以在类定义的时候,一定要用注释说明每个属性和函数代表的意义或实现的功能。
下面就来具体的说明一下如何做定义和实现。
首先是类的定义,我们实现一个Circle.h头文件来定义圆这个类。
先来说一下怎么添加Circle.h文件吧。我用了一个比较笨的办法(使用的IDE是CodeBlocks),现在项目的同目录下新建一个文本文档,然后改名为Circle.h。
然后打开CodeBlocks,右键你的项目名,单击Add files...(我的已经添加进去了,下边Headers那个目录就是)
然后选中你要添加的文件,点击打开,然后确定即可。
接下来我们就可以编辑这个.h文件了。
下面是Circle.h文件的内容:
#ifndef CIRCLE_H
#define CIRCLE_H
//上面的意思是防止重复包含
class Circle { public: //圆的半径 double radius; //无参构造函数 Circle(); //有参构造函数 Circle(double); //获取圆的面积 double getArea(); };
#endif
然后是类实现的Circle.cpp文件,添加的方法同上,这里不过多赘述。直接给出Circle.cpp文件
#include "Circle.h" //无参构造函数 Circle::Circle() { radius = 1; } //有参构造函数 Circle::Circle(double newRadius) { radius = newRadius; } //获取面积 double Circle::getArea() { return radius*radius*PI; }
解释一下符号“::”,这个符号在C++中叫做作用域解析运算符。顾名思义,它的作用就是用来解析作用域的。在上面的例子中,它告诉这些构造函数和函数,它们是属于Circle类的。
更多关于“::”符号的解释,可以参见下面这篇博客:
现在已经完成了类的定义和实现,也就是说,一个类已经完成了。接下来就是使用这个类了。
使用这个类和之前的做法大同小异,唯一不同的就是要在main.cpp中加上#include "Circle.h"
看下面的例子
#include <iostream> #include "Circle.h" using namespace std; int main() { //调用无参构造函数 Circle c1; //调用有参构造函数,参数为1 Circle c2(1); //调用有参构造函数,参数为3 Circle c3(3); cout << "c1的半径是" << c1.radius << ",面积是" << c1.getArea() << endl; cout << "c2的半径是" << c2.radius << ",面积是" << c2.getArea() << endl; cout << "c3的半径是" << c3.radius << ",面积是" << c3.getArea() << endl; return 0; }
运行结果: