• 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;
    }

    运行结果:

  • 相关阅读:
    JVM(一)--Java内存区域
    leetcode33 搜索旋转排序数组
    二叉树的相关算法(一)
    分别求二叉树前、中、后序的第k个节点
    【蓝桥杯】历届试题 买不到的数目
    JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
    【蓝桥杯】核桃的数量
    Java内存分析之对象实例化操作初步分析
    【蓝桥杯】算法训练 K好数
    【蓝桥杯】基础练习试题
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12679052.html
Copyright © 2020-2023  润新知