• C++核心编程类的总结封装案例


    C++类的总结封装案例

    1.立方体类的封装

    在C++中,我们可以定义一个立方体(Cube)类来封装立方体的属性和方法。立方体的属性可能包括边长(side length),而方法可能包括计算表面积(area)和体积(volume)。

    #include 
    using namespace std;
    
    class Cube {
    private:
        int  sideLength; // 立方体的边长
    
    public:
    
        // 计算表面积的方法
        int getArea() {
            return 6 * sideLength * sideLength; // 立方体有6个面,每个面的面积是边长的平方
        }
    
        // 计算体积的方法
        int getVolume(){
            return sideLength * sideLength * sideLength; // 体积是边长的三次方
        }
    
        // 设置边长的方法(可选)
        void setSideLength(int length) {
            sideLength = length;
        }
    };
    
    int main() {
        // 创建一个边长为5的立方体对象
        Cube cube{};
        cube.setSideLength(5);
        // 输出立方体的表面积和体积
        cout << "Area of the cube: " << cube.getArea() << endl;
        cout << "Volume of the cube: " << cube.getVolume() << endl;
    
        return 0;
     }
    

    在上面的代码中,我们定义了一个名为Cube的类,它有一个私有成员变量sideLength来存储立方体的边长。我们还定义了两个公有成员函数getAreagetVolume来计算立方体的表面积和体积。此外,我们还提供了一个构造函数来初始化立方体的边长,以及两个可选的公有成员函数setSideLengthgetSideLength来设置和获取边长。在main函数中,我们创建了一个边长为5的立方体对象,并输出了它的表面积和体积。

    2.点与圆的关系的封装

    在C++中,我们要封装点与圆的关系,首先需要两个类,一个点类和一个圆类。然而在实际开发中,把所有的类都放在一个文件中会导致文件的难以管理,以及可维护性的降低。这时就需要类的分文件编写。

    首先要封装一个点类。我们通常在头文件中声明类,在源文件中编写成员函数。

    #include "point.h"
    
    /**
     * 设置点的X坐标
     * @param x 新的X坐标值
     */
    void point::setX(double x) {
        X = x;
    }
    
    /**
     * 设置点的Y坐标
     * @param y 新的Y坐标值
     */
    void point::setY(double y) {
        Y = y;
    }
    
    /**
     * 获取点的X坐标
     * @return 当前的X坐标值
     */
    double point::getX(){
        return X;
    }
    
    /**
     * 获取点的Y坐标
     * @return 当前的Y坐标值
     */
    double point::getY(){
        return Y;
    }
    
    

    在头文件声明类。

    #pragma once
    #include "point.h"
    
    /**
     * @class point
     * 二维平面中的点类定义。
     * 该类用于表示二维平面中的一个点,包含点的X坐标和Y坐标。
     */
    class point {
        double X; /**< 点的X坐标 */
        double Y; /**< 点的Y坐标 */
    
    public:
        /**
         * 设置点的X坐标。
         * @param x 新的X坐标值。
         */
        void setX(double x);
    
        /**
         * 设置点的Y坐标。
         * @param y 新的Y坐标值。
         */
        void setY(double y);
    
        /**
         * 获取点的X坐标。
         * @return 当前点的X坐标值。
         */
        double getX();
    
        /**
         * 获取点的Y坐标。
         * @return 当前点的Y坐标值。
         */
        double getY();
    
    };
    
    

    圆类的封装。与点类分文件相同。

    #include "circle.h"
    #include "point.h"
    
    /**
     * 设置圆的半径
     * @param r 圆的新半径
     */
    void  circle::setRadius(double r){
        radius=r;
    }
    
    /**
     * 获取圆的半径
     * @return 圆的半径
     */
    int circle::getRadius() const{
        return radius;
    }
    
    /**
     * 设置圆的中心点
     * @param p 新的中心点坐标
     */
    void circle::setCenter(point p){
        center=p;
    }
    
    /**
     * 获取圆的中心点
     * @return 圆的中心点坐标
     */
    point circle::getCenter() {
        return center;
    }
    

    圆类的头文件。

    #pragma once
    #include "point.h"
    
    /**
     * @brief 表示一个圆的类
     * 
     * 该类定义了一个圆,包括圆的半径和圆心。提供了设置和获取半径以及设置和获取圆心的方法。
     */
    class circle {
    public:
        /**
         * @brief 设置圆的半径
         * 
         * @param r 圆的新半径
         */
        void setRadius(double r);
    
        /**
         * @brief 获取圆的半径
         * 
         * @return 圆的半径
         */
        [[nodiscard]] int getRadius() const;
    
        /**
         * @brief 设置圆的圆心
         * 
         * @param p 新的圆心坐标点
         */
        void setCenter(point p);
    
        /**
         * @brief 获取圆的圆心
         * 
         * @return 圆的圆心坐标点
         */
        point getCenter();
    
    private:
        double radius; /**< 圆的半径 */
        point center;  /**< 圆的圆心 */
    };
    

    在主函数中对类进行调用。

    #include "iostream"
    using namespace std;
    #include "circle.h"
    #include "point.h"
    
    /**
     * 判断一个点是否在给定圆上、内部或外部。
     * @param c 圆对象,包含圆的中心和半径。
     * @param p 点对象,要判断的点的坐标。
     */
    void isSame(circle& c, point& p)
    {
      // 计算圆的半径的平方
      int doRadius = c.getRadius() * c.getRadius();
      // 计算点到圆心的距离的平方
      double length;
      length = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX())
               + ((c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY()));
      // 判断点的位置:在圆上、在圆内还是在圆外
      if (doRadius == length)
        cout << "在圆上" << endl;
      else if (doRadius > length)
        cout << "在圆内" << endl;
      else
        cout << "在圆外" << endl;
    }
    
    int main() {
        circle c{};
        point p{};
        // 设置圆的半径
        c.setRadius(5);
        // 设置点的坐标
        p.setX(5);
        p.setY(0);
        // 设置圆的中心为给定的点
        c.setCenter(p);
        // 输出圆的中心坐标和半径
        cout << "圆心坐标为(" << c.getCenter().getX() << "," << c.getCenter().getY() << ")" << endl;
        cout << "半径为" << c.getRadius() << endl;
        point p1{};
        // 设置另一个点的坐标
        p1.setX(5);
        p1.setY(10);
        // 判断该点是否在圆上、内部或外部
        isSame(c, p1);
        return 0;
    }
    

    主函数用于判断一个点是否在给定圆上、内部或外部。函数接受一个圆对象和一个点对象作为参数,通过计算点到圆心的距离与圆的半径的平方进行比较,来确定点的位置关系。具体步骤如下:
    计算圆的半径的平方,存储在变量doRadius中。
    计算点到圆心的距离的平方,存储在变量length中。
    通过比较doRadiuslength的大小关系,判断点的位置:
    doRadius等于length,则点在圆上。
    doRadius大于length,则点在圆内。
    doRadius小于length,则点在圆外。
    根据判断结果,输出相应的信息。
    main函数中,首先创建了一个圆对象和一个点对象,并设置了圆的半径和点的坐标。然后通过调用isSame函数,判断另一个点是否在圆上、内部或外部,并输出相关信息。

    3.总结

    在C++中,类是面向对象编程(OOP)的核心概念之一。类是一种用户定义的数据类型,它允许我们将数据(成员变量)和操作这些数据的方法(成员函数)组合在一起。下面是对C++中类的一些关键知识总结:

    1. 类的定义
      • 使用class关键字定义类。
      • 类可以包含私有(private)、保护(protected)和公有(public)成员。
      • 私有成员只能被类内部的成员函数访问,而公有和保护成员可以在类外部被访问(对于保护成员,派生类也可以访问)。
    2. 成员变量(也称为属性或字段):
      • 成员变量是类的数据部分,用于存储类的状态。
      • 它们可以在类的声明中定义,也可以在类的实现文件(如果有的话)中定义。
    3. 成员函数(也称为方法):
      • 成员函数是类的方法部分,定义了可以对类的数据进行哪些操作。
      • 它们可以是普通的函数,也可以是构造函数、析构函数、拷贝构造函数、移动构造函数、拷贝赋值运算符和移动赋值运算符等特殊成员函数。
    4. 访问修饰符
      • public:类外部可以访问的成员。
      • private:类外部无法访问的成员,只能被类内部(包括成员函数和友元)访问。
      • protected:与private类似,但允许派生类访问。

    这些是C++中类的一些关键概念和特性。通过学习和使用这些特性,我们可以编写更加灵活、可重用和易于维护的代码。

  • 相关阅读:
    java中的直接内存
    如何给Nginx配置访问IP白名单
    ECMA各版本特性
    mybatis之动态SQL语句&分页查询
    过滤器、监听器、拦截器的区别,你都搞懂了吗?
    常见的系统类别汇总——包含OA/CRM/ERP/SCM
    1. 使用STM32CubeMX建立STM32G030C8T6项目工程
    【牛客-SQL进阶挑战】增删改操作 (插入记录SQL110-112 更新记录SQL113-114 删除记录SQL115-117)
    Spring事务
    pragma once与ifndef的区别
  • 原文地址:https://blog.csdn.net/weixin_73497355/article/details/139392782