C++零碎记录(二)

3. 调用其他类

3.1 类中有其他的类

复制代码
#include <iostream>
using namespace std;

//点和圆关系案例

//点类
class Point
{
public:
    //设置x
    void setX(int x)
    {
        m_X = x;
    }
    //获取x
    int getX()
    {
        return m_X;
    }
    //设置y
    void setY(int y)
    {
        m_Y = y;
    }
    //获取y
    int getY()
    {
        return m_Y;
    }

private:
    int m_X;
    int m_Y;
};

//圆类
class Circle
{
public:
    //设置半径
    void setR(int r)
    {
        m_R = r;
    }
    //获取半径
    int getR()
    {
        return m_R;
    }
    //设置圆心
    void setCenter(Point center)
    {
        m_Center = center;
    }
    //获取圆心
    Point getCenter()
    {
        return m_Center;
    }
private:
    int m_R; //半径
    Point m_Center; //圆心   //在类中可以让另一个类 作为本类中的成员
};

//判断点和圆关系
void isInCircle(Circle& c, Point& p)
{
    //计算两点之间距离 平方
    int distance =
        (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
        (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());   //c.getCenter()返回的是圆心点center类
                                                                                 //可以调用圆心点center类中的方法

    //计算半径的平方
    int rDistance = c.getR() * c.getR();

    //判断关系
    if (distance == rDistance)
    {
        cout << "点在圆上" << endl;
    }
    else if (distance > rDistance)
    {
        cout << "点在圆外" << endl;
    }
    else
    {
        cout << "点在圆内" << endl;
    }
}

int main()
{
    //创建圆
    Circle c;
    c.setR(10);
    Point center;
    center.setX(10);       //设置点的横坐标
    center.setY(0);        //设置点的纵坐标
    c.setCenter(center);   //设置点类传入圆类

    //创建点
    Point p;
    p.setX(10);
    p.setY(10);

    //判断关系
    isInCircle(c, p);

    system("pause");

    return 0;

}

运行结果:

  • 点在圆上
  • 请按任意键继续. . .

3.2 导入其他文件的类

3.2.1 point.h头文件

复制代码
//这是point.h头文件

#pragma once //防止头文件重复包含,防止头文件冲突
#include <iostream> //标准输入输出
using namespace std; //标准命名空间

//只要函数声明、变量声明
//成员函数只需要声明就好了,末尾有分号。
class Point
{
public:
    //设置x
    void setX(int x);

    //获取x
    int getX();

    //设置y
    void setY(int y);

    //获取y
    int getY();


private:
    int m_X;
    int m_Y;
};

3.2.2 point.cpp源文件

复制代码
//这是point.cpp源文件
#include "point.h"

//定义函数时,要加上作用域,"双冒号::"表示Point作用域下的函数
void Point::setX(int x)
{
    m_X = x;
}
//获取x
int Point::getX()
{
    return m_X;
}
//设置y
void Point::setY(int y)
{
    m_Y = y;
}
//获取y
int Point::getY()
{
    return m_Y;
}

3.2.3 circle.h头文件

复制代码
#pragma once 
#include <iostream>  //标准输出流
using namespace std; //标准命名空间
#include "Point.h"  //一个类中用到另一个类,把另一个类包含的头文件包含进来

//圆类
class Circle
{
public:
    //设置半径
    void setR(int r);

    //获取半径
    int getR();

    //设置圆心
    void setCenter(Point center);

    //获取圆心
    Point getCenter();

private:
    int m_R; //半径
    Point m_Center; //圆心   //在类中可以让另一个类 作为本类中的成员
};

3.2.4 circle.cpp头文件

复制代码
//这是circle.cpp头文件

#include "circle.h"

//设置半径
void Circle::setR(int r)
{
    m_R = r;
}

//获取半径
int Circle::getR()
{
    return m_R;
}

//设置圆心
void Circle::setCenter(Point center)
{
    m_Center = center;
}

//获取圆心
Point Circle::getCenter()
{
    return m_Center;
}

3.2.5 main.cpp文件

复制代码
//这个是主文件 .cpp文件

#include <iostream>
using namespace std;
#include "circle.h" //想用点类,就要包含点类的头文件
#include "point.h"  //想用圆类,就要包含点类的头文件


//判断点和圆关系
void isInCircle(Circle& c, Point& p)
{
    //计算两点之间距离 平方
    int distance =
        (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
        (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());   //c.getCenter()返回的是圆心点center类
                                                                                 //可以调用圆心点center类中的方法

    //计算半径的平方
    int rDistance = c.getR() * c.getR();

    //判断关系
    if (distance == rDistance)
    {
        cout << "点在圆上" << endl;
    }
    else if (distance > rDistance)
    {
        cout << "点在圆外" << endl;
    }
    else
    {
        cout << "点在圆内" << endl;
    }
}

int main()
{
    //创建圆
    Circle c;
    c.setR(10);
    Point center;
    center.setX(10);       //设置点的横坐标
    center.setY(0);        //设置点的纵坐标
    c.setCenter(center);   //设置点类传入圆类

    //创建点
    Point p;
    p.setX(10);
    p.setY(10);
    
    //判断关系
    isInCircle(c, p);

    system("pause");

    return 0;

}

4. 对象的初始化和清理

① 对象的初始化和清理是两个非常重要的安全问题。

② 一个对象或者变量没有初始状态,对其使用后果是未知。

③ 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。

④ C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。

⑤ 对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供编译器提供的构造函数和析构函数是空实现。

作者:小王同学在积累

链接:https://www.zhihu.com/question/437657370/answer/1692846096

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
nice_lcj52015 分钟前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
蒸蒸yyyyzwd36 分钟前
学习笔记 八股手撕
笔记·学习
揣一尾游鱼yu2 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
樱花树下的数学喵2 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
AI吃大瓜2 小时前
指针压力表读数3:C/C++实现指针压力表读数(可实时检测)
c++·指针读数·指针压力表·压力表自动读数·压力表读数
-银雾鸢尾-2 小时前
两数之和-C++实现
c++·算法
j7~2 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
jimy12 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++
留岁3 小时前
大模型推理部署 · 学习文档
学习
揽星河..3 小时前
【C++】类和对象
c++·算法