C++——类和对象之类定义和类实现的分离 C++ 二元作用域运算符(::)

类定义和类实现的分离

类定义就是指定义类名,类的数据域和类里面的函数。只是定义而不去实现。这一概念有点像是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类的。

更多关于“::”符号的解释,可以参见下面这篇博客:

C++ 二元作用域运算符(::)

现在已经完成了类的定义和实现,也就是说,一个类已经完成了。接下来就是使用这个类了。

使用这个类和之前的做法大同小异,唯一不同的就是要在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;
}

运行结果:

猜你喜欢

转载自www.cnblogs.com/bwjblogs/p/12679052.html