内容
1.封装的意义
2.类的概念与使用
3.class与struct的异同
4.案例练习(实验)
———————————————————————————————————————————
*1.封装的意义
封装是C++面向对象的三大特性之一!!!
意义:
- 将属性和行为作为一个整体表现生活中的事物——类(相同类型的对象)
- 将属性和行为加以权限控制(三种权限)
*2.类的概念与使用
定义: 具有相同性质的对象,我们可以抽象称为类。
- 人属于人类——人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…
- 车属于车类——车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…
语法:class 类名 {访问权限:属性/行为};- //公共权限 public 类内可以访问 类外可以访问
- //保护权限 protected 类内可以访问 类外不可以访问
- //私有权限 private 类内可以访问 类外不可以访问
重点使用:
- 将成员属性设置为私有,可以自己控制读写权限;
- 对于写权限,编译人员可以控制数据的有效性;
- 可以设置属性的可写可读权限
设计:设计一个类,把属性和行为写在一起,表示一个事物。
例1:封装一个圆类,用于计算圆的面积和周长
- 圆的属性:圆的半径
- 圆的行为:计算圆的面积、计算圆的周长
#include<iostream>
using namespace std;
#define Pi 3.14
class circle {
public:
//属性
int R;
//行为
double calculateS() {
return Pi * R * R;
}
double calculateC() {
return 2 * Pi * R;
}
};
int main() {
//通过圆类创建圆的对象
circle c;
c.R = 1;
cout << "圆c的半径为:" << c.R << ",周长为:" << c.calculateC() << endl;
cout << "圆c的半径为:" << c.R << ",面积为:" << c.calculateS() << endl;
system("pause");
return 0;
}
例2:设置一个人类,姓名为公有权限,私车为保护权限,密码为私有权限;行为给属性赋初值;
#include<iostream>
using namespace std;
class person {
public:
string name;
private:
int password;
protected:
string car;
public:
void set() {
name = "王五";
car = "挖掘机";//保护属性类内可以访问
password = 123;//私有属性类内可以访问
}
};
int main() {
class person p;
p.set();
cout << "人的姓名为:" << p.name << endl;
p.name = "李四";
cout << "人的姓名为:" << p.name << endl;
//p.car = "宝马";
//p.password = 12;
//私有和保护属性类外不能被访问
system("pause");
return 0;
}
可以看到:私有和保护属性类外不能被访问!!!
*3.class与struct的异同
struct :用户可自定义的一种数据类型,结构体内可以定义不同数据类型的结构体成员,也可以定义结构体成员函数;
class : 用户自定义的一种描述对象的数据类型,类内可以定义不同类型的类属性,也可以定义多种类行为;
- *相同点:
- 创建对象后,都利用“ 变量名 . 成员属性or行为/成员函数 ”进行赋值操作;
- 都可定义多种不同数据类型的属性
- *不同点:
- struct 默认权限为公有,结构体外可访问
- class 默认权限为私有,类外不可访问
*4.案例练习
*注意: 需要创建多个类对象,调用类成员函数时,需要引用传递(实现地址传递),避免调用成员函数时出错;
(1)设计立方体类(Cube)
- 求出立方体的体积
- 分别用全局函数和成员函数判断两个立方体是否相等。
#include<iostream>
using namespace std;
class cube {
private:
int L;
int W;
int H;
public:
//设置长宽高
void setL(int l) {
L = l;
}
void setW(int w) {
W = w;
}
void setH(int h) {
H = h;
}
//读取长宽高
int getL() {
return L;
}
int getW() {
return W;
}
int getH() {
return H;
}
//创建计算立方体体积的成员函数
int calculateV() {
return L * W * H;
}
//创建判断两个立方体是否相等的成员函数
bool Is_same(cube& c) {
if (L == c.getL() && W == c.getW() && H == c.getH()) {
return true;
}
return false;
}
};
//创建全局函数判断两个立方体是否相等
bool isSame(cube& c1, cube& c2)
{
if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
{
return true;
}
return false;
}
int main() {
class cube c1;
c1.setL(1);
c1.setW(1);
c1.setH(1);
class cube c2;
c2.setL(1);
c2.setW(2);
c2.setH(1);
cout << "立方体c1的体积为:" << c1.calculateV() << endl;
cout << "立方体c2的体积为:" << c2.calculateV() << endl;
cout << "调用成员函数判断两个立方体是否相等:" << endl;
bool ret = c1.Is_same(c2);
if (ret == 1) {
cout << "两个立方体相等!" << endl;
}
else {
cout << "两个立方体不相等!" << endl;
}
cout << "调用全局函数判断两个立方体是否相等:" << endl;
ret = isSame(c1, c2);
if (ret == 1) {
cout << "两个立方体相等!" << endl;
}
else {
cout << "两个立方体不相等!" << endl;
}
sysytem("pause");
return 0;
}
(2)点和圆的关系
- 设计一个圆形类(Circle),和一个点类(Point);
- 计算点和圆的关系。
#include<iostream>
using namespace tsd;
//创建一个点类
class point {
private:
int X;
int Y;
public: //点类公共接口,设置行为
void setX(int x) //设置点的X坐标
{
X = x;
}
int getX() //获取点的X坐标
{
return X;
}
void setY(int y) //设置点的Y坐标
{
Y = y;
}
int getY() //设置点的Y坐标
{
return Y;
}
};
//创建一个圆类
class circle {
private:
int R; //创建圆类中半径属性
point Center; //创建圆类中的点类圆点属性
public: //圆类的公共接口
void setR(int r) //圆类中设置圆半径的成员函数
{
R = r;
}
int getR() //获取圆的半径
{
return R;
}
void setCenter(point center)//设置圆心坐标的行为/函数
{
Center = center;
}
point getCenter() //获取圆心坐标
{
return Center;
}
};
//创建一个判断点和圆关系的一个函数
void isIncircle(circle& c, point& p)
{
int rdistance = c.getR() * c.getR(); //计算圆半径的平方
int distance = //计算圆点到点p的距离的平方
(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
if (rdistance == distance) //如果点到远点的距离等于半径则点在圆上
{
cout << "点在圆上" << endl;
}
else if (rdistance > distance) //点到圆点的距离小于半径则点在圆内
{
cout << "点在圆内" << endl;
}
else //否则点到圆点的距离大于半径则点在圆外
{
cout << "点在圆外" << endl;
}
}
int main() {
circle c; //创建一个圆类的对象c
c.setR(10); //设置圆的半径为10,通过圆类的对象c调用圆类中的设置半径的成员函数
point center; //创建点类的center点
center.setX(10); //设置点center的X坐标
center.setY(0); //设置点center的Y坐标
c.setCenter(center); //把上面创建的点center给圆类c的属性圆心
point p; //创建一个点类的对象p
p.setX(10); //给点p设置X坐标
p.setY(10); //给点p设置Y坐标
isIncircle(c, p); //调用全局函数判断圆和点的关系
sysytem("pause");
return 0;
}