案例2:点和圆的关系
回顾
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限: 属性 / 行为 };
示例1:设计一个圆类,求圆的周长
示例代码:
//圆周率
constdoublePI=3.14;
//1、封装的意义
//将属性和行为作为一个整体,用来表现生活中的事物
//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
classCircle
{
public: //访问权限 公共的权限
//属性
intm_r;//半径
//行为
//获取到圆的周长
doublecalculateZC()
{
//2 * pi * r
//获取圆的周长
return 2*PI*m_r;
}
};
intmain() {
//通过圆类,创建圆的对象
// c1就是一个具体的圆
Circlec1;
c1.m_r=10; //给圆对象的半径 进行赋值操作
//2 * pi * 10 = = 62.8
cout<<"圆的周长为: "<<c1.calculateZC() <<endl;
system("pause");
return0;
}
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- public 公共权限
- protected 保护权限
- private 私有权限
题目
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
代码解析
#include
usingnamespacestd;
//点类
classPoint
{
private:
intm_X;intm_Y;
public:
//设置读写权限
voidsetX(intx){m_X=x;}
intgetX(){returnm_X;}
voidsetY(inty){m_Y=y;}
intgetY(){returnm_Y;}
}
//圆类
classCircle
{
private:
intm_R;
Pointm_Center;
public:
//设置读写权限,半径
voidsetR(intr){m_R=r;}
intgetR(){returnm_R;}
//设置圆心
voidsetCenter(Pointcenter)
{
m_Center=center;
}
PointgetCenter()
{
returnm_Center;
}
}
//判断点和园的位置关系
voidisInCircle()
{
//计算两点间的距离的平方
intdistance=
(c.getCenter().getX() -p.getX() *c.getCenter().getX() -p.getX()) +
(c.getCenter().getY() -p.getY() *c.getCenter().getY() -p.getY());
//计算半径平方
intrDistance=c.getR() *c.getR();
//判断
if (distance=rDistance)
{
cout<<"圆上"<<endl;
}
elseif (distance>rDistance)
{
cout<<"圆外"<<endl;
}
else
{
cout<<"圆圆内"<<endl;
}
}
intmain()
{
}
案例刨析
案例原理:通过比较点与圆心的距离与半径的距离来判断点与园 的位置关系。
案例核心1:一个类可以作为另一个类的成员!
点类可以作为圆类的成员
案例核心2:可以把类拆到另外一个文件里面,头文件写声明,源文件写实现。
主体文件之用来存放判断点和圆的关系的函数和main函数,使程序的目的更加明确,代码更加易读。
分别创建点类和圆类.h的头文件用来存放类的声明,圆类和点类的.cpp源文件存放类的实现。
注意在两个文件的类里去除相应的内容!
注意在类的实现里要加上作用域,因为实现里不写类的声明!类的实现里需要引入头文件。
圆类的声明,圆类的实现。
注意要引入点类的头文件!
扩展:#pragma once
#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式——
第一种是#ifndef指令防止代码块重复引用
第二种就是#pragma once指令,在想要保护的文件开头写入
#pragma once
#pragma once一般由编译器提供保证:同一个文件不会被包含多次。这里所说的”同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。无法对一个头文件中的一段代码作#pragma once声明,而只能针对文件。此方式不会出现宏名碰撞引发的奇怪问题,大型项目的编译速度也因此提供了一些。缺点是如果某个头文件有多份拷贝,此方法不能保证它们不被重复包含。在C/C++中,#pragma once是一个非标准但是被广泛支持的方式。
#pragma once方式产生于#ifndef之后。#ifndef方式受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式有些编译器不支持(较老编译器不支持,如GCC 3.4版本之前不支持#pragmaonce),兼容性不够好。#ifndef可以针对一个文件中的部分代码,而#pragma once只能针对整个文件。相对而言,#ifndef更加灵活,兼容性好,#pragma once操作简单,效率高。