本文通过创建一个判断点与圆的坐标位置关系的一段小代码,来练习C++中函数和类的相关知识,巩固函数封装的操作。
目录
1 基础功能实现
导入头文件:
#include<iostream>
using namespace std;
1.1 创建点类
class point
{
public:
//设置点的x坐标
void set_x(int x)
{
m_x=x;
}
//获取坐标
int get_x()
{
return m_x;
}
//设置点y的坐标
void set_y(int y)
{
m_y = y;
}
//获取坐标
int get_y()
{
return m_y;
}
private:
int m_x;
int m_y;
};
1.2 创建圆类
class circle
{
public:
//设置半径
void set_r(int r)
{
m_r = r;
}
//获取半径
int get_r()
{
return m_r;
}
//设置圆心(这里传的是坐标)
void setCenter(point center)
{
m_center = center;
}
//获取圆心
point getCenter()
{
return m_center;
}
private:
int m_r;//半径
point m_center;//自定义一个点类坐标,用来表示圆心
};
1.3 位置判断函数
//判断点与圆的坐标位置关系
void isInCircle(circle &c,point &p)
{
//计算两点之间距离的平方
int distance = (c.getCenter().get_x() - p.get_x()) * (c.getCenter().get_x() - p.get_x()) +
(c.getCenter().get_y() - p.get_y()) * (c.getCenter().get_y() - p.get_y());
//计算半径的平方
int rDistance = c.get_r() * c.get_r();
//判断关系
if (distance == rDistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
1.4 main函数
int main()
{
//创建一个点
point p1;
p1.set_x(5);
p1.set_y(5);
//创建一个圆
circle c1;
c1.set_r(5);
point center;
center.set_x(0);
center.set_y(0);
c1.setCenter(center);
isInCircle(c1, p1);
system("pause");
return 0;
}
至此,运行代码,所有功能全部实现,上面也是所有代码未封装前的样子。下面是函数和类的封装。
2 封装
2.1 point类分装
2.1.1 头文件point.h
创建point.h的头文件(头文件中只需要声明即可):
#pragma once //防止头文件的重复包含
#include <iostream> //标准输出流
using namespace std; //标准名空间
//点类 将上面点类的代码复制下来,将具体的操作删除,只保留声明,注意加分号;
class point
{
public:
//设置x点的坐标
void set_x(int x);
//获取坐标
int get_x();
//设置y点的坐标
void set_y(int y);
//获取坐标
int get_y();
private:
int m_x;
int m_y;
};
2.1.2 point.cpp
导入刚创建好的point.h头文件,将点类的代码复制并只留下函数的具体实现的部分,函数前面加上point的作用域:
#include "point.h" //导入创建的头文件
void point::set_x(int x) //需要加上point作用域
{
m_x = x;
}
//获取坐标
int point::get_x()
{
return m_x;
}
//设置y点的坐标
void point::set_y(int y)
{
m_y = y;
}
//获取坐标
int point:: get_y()
{
return m_y;
}
这样,有关点类的封装就做好了。
2.2 circle类封装
2.2.1 circle.h
#pragma once
#include <iostream>
using namespace std;
#include"point.h" //需要点类支撑
class circle
{
public:
//设置半径
void set_r(int r);
//获取半径
int get_r();
void setCenter(point center);
point getCenter();
private:
int m_r;//半径
point m_center;//自定义一个点类坐标,用来表示圆心
};
2.2.2 circle.cpp
#include"circle.h"
//设置半径
void circle :: set_r(int r)
{
m_r = r;
}
//获取半径
int circle::get_r()
{
return m_r;
}
//设置圆心(这里传的是坐标)
void circle::setCenter(point center)
{
m_center = center;
}
//获取圆心
point circle::getCenter()
{
return m_center;
}
2.3 判断函数的封装
2.3.1 isInCircle.h
#pragma once
#include<iostream>
using namespace std;
#include"circle.h" //需要传入圆类
void isInCircle(circle& c, point& p);
2.3.2 isInCircle.cpp
#include"isInCircle.h"
void isInCircle(circle& c, point& p)
{
//计算两点之间距离的平方
int distance = (c.getCenter().get_x() - p.get_x()) * (c.getCenter().get_x() - p.get_x()) +
(c.getCenter().get_y() - p.get_y()) * (c.getCenter().get_y() - p.get_y());
//计算半径的平方
int rDistance = c.get_r() * c.get_r();
//判断关系
if (distance == rDistance)
{
cout << "点在圆上" << endl;
}
else if (distance > rDistance)
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
2.4 封装后的main函数
导入封装好的头文件
#include<iostream>
using namespace std;
#include"circle.h"
#include "point.h"
#include"isInCircle.h"
int main()
{
//创建一个点
point p1;
p1.set_x(5);
p1.set_y(5);
//创建一个圆
circle c1;
c1.set_r(5);
point center;
center.set_x(0);
center.set_y(0);
c1.setCenter(center);
isInCircle(c1, p1);
system("pause");
return 0;
}
至此,所有实现函数的各个子模块都封装完成,包含point.h; point.cpp; circle.h; circle.cpp; isInCircle.h; isInCircle.cpp;main程序,7个子文件。