封装
意义
• 将属性和行为作为一个整体,表现生活中的事物
• 将属性和行为加以权限控制
意义一:语法class 类名{访问权限:属性/ 行为};
意义二:类在设计时,可以把属性和行为放在不同的权限下,加以控制
【三种访问权限】
权限名称 | 类内、类外访问情况 | 继承访问情况 | |
---|---|---|---|
public | 公共权限 | 成员 类内可以访问、类外也可以访问 | |
protected | 保护权限 | 成员 类内可以访问、类外不能访问 | 继承中子类可以访问父类的保护内容 |
private | 私有权限 | 成员 类内可以访问、类外不能访问 | 继承中子类不能访问父类的保护内容 |
1.struct和class的区别
唯一的区别在于:默认的访问权限不同
• struct默认权限为公共
• class默认权限为私有
2.成员属性设为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
class Person
{
private:
string m_name; //姓名 可读可写
string m_lover; //情人 只写
int m_age; //年龄 只读
public:
//写年龄(设置姓名)
void setname(string name)
{
m_name = name;
}
//读姓名(获取姓名)
string getname()
{
return m_name;
}
//读年龄
int getage()
{
return m_age;
}
//写年龄
void setname(int age)
{
if (age < 0 || age >150)
{
m_age = 0;
cout << "输入的年龄数据有误!" << endl;
return;
}
m_age = age;
}
//设置情人
void setlover(string lover)
{
m_lover = lover;
}
};
int main()
{
Person p1;
p1.setname("张三");
cout << "姓名为: " << p1.getname() << endl;
p1.setname(18);
cout << "年龄为: " << p1.getage() << endl;
p1.setlover("李四");
return 0;
}
3.封装案例1(立方体)
【立方体类设计】
1.创建立方体类
2.设计属性:长L宽W高H
3.设计行为:获取立方体的面积和体积
4.分别利用全局函数和成员函数判断两个立方体是否相等
(1)步骤1~3:创建类并设计属性和行为
1.创建立方体类
2.设计属性:长L宽W高H
3.设计行为:获取立方体的面积和体积
class Cube
{
private:
int m_L; //长
int m_W; //宽
int m_H; //高
public:
int getcube_Area()
{
return 2 * (m_L * m_W + m_W * m_H + m_L * m_H);
}
int getcube_Volume()
{
return m_L * m_W * m_H;
}
};
(2)步骤4:构造函数判断两个立方体是否相等
4.分别利用全局函数和成员函数判断两个立方体是否相等
备注:
此处使用全局函数,则函数参数需要传入两个立方体;
使用成员函数只要传入一个立方体即可(即第二个立方体)。
//利用成员函数判断两个立方体是否相等
class Cube
{
public:
//利用成员函数判断两个立方体是否相等
bool isSame2(Cube& c)
{
if (m_L == c.get_L() && m_W == c.get_W() && m_H == c.get_H())
{
return true;
}
return false;
}
};
//利用全局函数判断两个立方体是否相等
bool isSame1(Cube& c1, Cube& c2)
{
if (c1.get_L() == c2.get_L() && c1.get_W() == c2.get_W() && c1.get_H() == c2.get_H())
{
return true;
}
return false;
}
(3)案例1源码
#include<iostream>
#include<string>
using namespace std;
//立方体类设计
//1.创建立方体类
//2.设计属性:长L宽W高H
//3.设计行为:获取立方体的面积和体积
//4.分别利用全局函数和成员函数判断两个立方体是否相等
class Cube
{
private:
int m_L; //长
int m_W; //宽
int m_H; //高
public:
void set_L(int L)
{
m_L = L;
}
int get_L()
{
return m_L;
}
void set_W(int W)
{
m_W = W;
}
int get_W()
{
return m_W;
}
void set_H(int H)
{
m_H = H;
}
int get_H()
{
return m_H;
}
int getcube_Area()
{
return 2 * (m_L * m_W + m_W * m_H + m_L * m_H);
}
int getcube_Volume()
{
return m_L * m_W * m_H;
}
//利用成员函数判断两个立方体是否相等
bool isSame2(Cube& c)
{
if (m_L == c.get_L() && m_W == c.get_W() && m_H == c.get_H())
{
return true;
}
return false;
}
};
//利用全局函数判断两个立方体是否相等
bool isSame1(Cube& c1, Cube& c2)
{
if (c1.get_L() == c2.get_L() && c1.get_W() == c2.get_W() && c1.get_H() == c2.get_H())
{
return true;
}
return false;
}
int main()
{
Cube c1;
c1.set_L(10);
c1.set_W(10);
c1.set_H(10);
cout << "该立方体面积为: " << c1.getcube_Area() << endl;
cout << "该立方体体积为: " << c1.getcube_Volume() << endl;
Cube c2;
c2.set_L(10);
c2.set_W(10);
c2.set_H(10);
bool ret = isSame1(c1, c2);
if (ret)
{
cout << "两个立方体是相等的" << endl;
}
else
{
cout << "两个立方体不相等" << endl;
}
ret = c1.isSame2(c2);
if (ret)
{
cout << "两个立方体是相等的" << endl;
}
else
{
cout << "两个立方体不相等" << endl;
}
return 0;
}
4.封装案例2(点和圆的关系)
计算点和圆心的距离
(1)步骤1:将点类和圆类分文件保存
- 点类的头文件point.h
#pragma once
#include<iostream>
using namespace std;
class Point
{
private:
int m_x;
int m_y;
public:
//设置横坐标X
void setX(int x);
//设置横坐标Y
void setY(int y);
//获得横坐标X
int getX();
//获得横坐标X
int getY();
};
- 点类的源文件point.cpp
#include"point.h"
//设置横坐标X
void Point::setX(int x)
{
m_x = x;
}
//设置横坐标Y
void Point::setY(int y)
{
m_y = y;
}
//获取横坐标X
int Point::getX()
{
return m_x;
}
//获取横坐标Y
int Point::getY()
{
return m_y;
}
- 圆类的头文件circle.h
#pragma once
#include<iostream>
#include"point.h"
using namespace std;
class Circle
{
private:
int m_r; //半径
Point m_center;
public:
//设置半径
void setR(double r);
//获得半径
double getR();
//设置圆心
void setCenter(Point center);
//获取圆心
Point getCenter();
};
- 圆类的源文件circle.cpp
#include"circle.h"
//设置半径
void Circle::setR(double r)
{
m_r = r;
}
//获得半径
double Circle::getR()
{
return m_r;
}
//设置圆心
void Circle::setCenter(Point center)
{
m_center = center;
}
//获取圆心
Point Circle::getCenter()
{
return m_center;
}
(2)步骤2:构建函数判断点和圆的关系
void isInCircle(Circle& c, Point& p)
{
double distance =
sqrt(
pow((c.getCenter().getX() - p.getX()), 2) +
pow((c.getCenter().getY() - p.getY()), 2)
);
if (distance == c.getR())
{
cout << "点在圆上" << endl;
}
else if (distance > c.getR())
{
cout << "点在圆外" << endl;
}
else
{
cout << "点在圆内" << endl;
}
}
(3)步骤3:主函数
#include<iostream>
#include<string>
#include"point.h"
#include"circle.h"
using namespace std;
int main()
{
//创建圆
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
//创建点
Point p, p1, p2;
p.setX(10); p.setY(10);
p1.setX(10); p1.setY(9);
p2.setX(10); p2.setY(11);
//判读关系
isInCircle(c, p);
isInCircle(c, p1);
isInCircle(c, p2);
return 0;
}