众所周知,C++具有三大特性,分别为封装、继承、多态,今天有位同学问到我应该如何去理解,我翻了翻笔记本,找到以前上课时学到的案例来解释。
首先,成员函数存在希望公开或不希望公开的属性,这也构成了定义成员函数访问级别的三项:
1、public:公开权限,类内与内外均可访问,体现为可读可写
2、private:私有权限,类内可访问但类外不可访问,体现为不可读可写
3、protected:保护权限,类内可访问但类外不可访问,不可读不可写,涉及到更多的继承部分,这里暂且按下不表
用一个案例来说明一下类:
//设计一个角色类
class Role
{
public:
//写名称
void setName(string name)
{
r_name = name;
}
//读名称
string getName()
{
return r_name;
}
//写编号
void setID(int id)
{
r_ID = id;
}
//读编号
int getID()
{
return r_ID;
}
//写技能
void setSkill(string skill)
{
r_skill = skill;
}
//读技能
string getSkill()
{
return r_skill;
}
private://角色属性
string r_name;
int r_ID;
string r_skill;
};
我们创建了一个角色的类,其中包含多种角色属性,接着通过在主函数中写入角色信息
void display(Role &r) {
cout <<"角色名:" << r.getName()<<" 角色编号:"<<r.getID()<<" 角色能力:"<<r.getSkill()<<endl;
}
int main()
{
Role r;
r.setName("Clark");
r.setID(001);
r.setSkill("rush");
display(r);
}
进行输出,我们将得到结果
角色名:Clark 角色编号:1 角色能力:rush
可以见得,封装可以将部分元素隐藏,并且隐藏其中的实现过程,如上代码的函数调用也是封装形式的一种体现。
而在更加复杂的工程中,封装调用就能显著的凸显其特性的优势,如,我们需要得到二维坐标轴中的点是否在圆上时便可使用。
我们知道两点之间的距离公式:
于是我们很容易便有了思路,只要圆心与点的距离等于半径,便可以得出是否在圆上,而我们也需要有圆和点两个类:
我们一个一个文件来看
#pragma once
#include<iostream>
using namespace std;
class Point//只做成员函数的声明
{
public:
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int p_X;
int p_Y;
};
这是生命成员函数:点的头文件
#include "point.h"
//public:
// void setX(int x)
// {
// p_X = x;
// }
// int getX()
// {
// return p_X;
// }
// void setY(int y)
// {
// p_Y = y;
// }
// int getY()
// {
// return p_Y;
// }//如果按上面角色属性的写法,将会产生报错,这是由于set,get属于成员函数,不能用全局函数的写法
void Point::setX(int x)//添加作用域:这是一个成员函数了
{
p_X = x;
}
int Point::getX()
{
return p_X;
}
void Point::setY(int y)
{
p_Y = y;
}
int Point::getY()
{
return p_Y;
}
此为点的源文件。
同理写出圆的:
#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 c_R; //半径
Point c_Center;//圆心
};
头文件
#include"circle.h"
//设置半径
void Circle::setR(int r)
{
c_R = r;
}
//获取半径
int Circle::getR()
{
return c_R;
}
//设置圆心
void Circle::setCenter(Point center)
{
c_Center = center;
}
//获取圆心
Point Circle::getCenter()
{
return c_Center;
}
源文件
最后,我们只要在test源文件里写入主函数和计算的函数就可以了,我们已经知道了两点之间距离的计算公式,但是根号并不好算,于是我们采用等号两边都取平方的算法,这样快捷方便,并且有效避免了圆心出现负值的情况。
#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());
//计算半径的平方
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(0);
center.setY(0);
c.setCenter(center);
//创建点
Point p;
p.setX(10);
p.setY(0);
//判断关系
isInCircle(c,p);
}