目录
C++面向对象的三大特性:封装、继承和多态。
一、封装
1. 封装的意义
封装是C++三大特性之一,其意义有
- 将属性和行为作为一个整体,表现现实生活中的事物;
- 将属性和行为加以权限控制。
2. 封装的语法
语法:class 类名{访问权限:成员属性;成员方法;}
#include <iostream>
using namespace std;
// 定义圆类
class Circle {
public: //访问权限:公有
//成员属性
double R;
//成员方法
double areaS() { //返回圆的周长
return 2 * 3.14 * R;
}
};
int main() {
//实例化
Circle C;
C.R = 2;
cout << C.areaS() << endl;
system("pause");
return 0;
}
3、访问权限
- public 公有权限,类内和类内都可访问
- private 私有权限,类内可以访问,类外不可以访问。子类继承父类时也不可以访问私有权限的属性和方法
- protected 保护权限,类内可以访问,类外不可以访问。子类继承父类时可以访问保护权限的属性和方法
4、C++中struct和class的区别、
两者本质上没有区别,但访问权限有所不同:
- struct 的访问权限默认为公共
- class 的访问权限默认为私有(即在类的定义中不指定访问权限时默认为私有)
5、成员属性私有化
在定义类的属性时,我们一般将类的属性的访问权限设置为私有,这样做的优点有:
- 所有属性私有化后,我们可以自己控制属性的读写权限,即可根据不同属性提供具有公共权限的读写方法;
- 对于写权限,可以检测数据的有效性(在写方法中使用if等语句检查数据是否正确,如年龄是否在0~150岁)。
二、封装示例
1. 长方体类案例
- 设计长方体类
- 使用类成员方法获取长方体的表面积和体积
- 使用全局函数获取长方体的表面积和体积
#include<iostream>
using namespace std;
class Cube {
//成员方法
public:
//设置长方体的长
void setLength(double L) {
m_L = L;
}
//返回长方体的长
double getLength() {
return m_L;
}
//设置长方体的宽
void setWide(double W) {
m_W = W;
}
//返回长方体的宽
double getWide() {
return m_W;
}
//设置长方体的高
void setHigh(double H) {
m_H = H;
}
//返回长方体的高
double getHigh() {
return m_H;
}
//返回长方体的表面积
double getArea() {
return (m_L*m_H + m_L*m_H + m_W*m_H) * 2;
}
//返回长方体的体积
double getVolume() {
return m_L*m_W*m_H;
}
private:
//成员属性
double m_L; //长
double m_W; //宽
double m_H; //高
};
//声明长方体表面积函数
double area(double L, double W, double H);
//声明长方体体积函数
double volume(double L, double W, double H);
int main() {
//从键盘获取长方体的长、宽、高
cout << "请输入长方体的长:" << endl;
double get_L;
cin >> get_L;
cout << "请输入长方体的宽:" << endl;
double get_W;
cin >> get_W;
cout << "请输入长方体的高:" << endl;
double get_H;
cin >> get_H;
//实例化长方体
Cube C1;
C1.setLength(get_L);
C1.setWide(get_W);
C1.setHigh(get_H);
//使用成员方法获取长方体表面积和体积
cout << "成员方法获取的长方体表面积为:" << C1.getArea() << endl;
cout << "成员方法获取的长方体体积为:" << C1.getVolume() << endl;
//使用全局函数获取长方体的表面积和体积
double L = C1.getLength(); //使用成员方法获取长方体的长
double W = C1.getWide(); //使用成员方法获取长方体的宽
double H = C1.getHigh(); //使用成员方法获取长方体的高
cout << "使用全局函数获取的长方体表面积为:" << area(L, W, H) << endl;
cout << "使用全局函数获取的长方体体积为:" << volume(L, W, H) << endl;
system("pause");
return 0;
}
//定义长方体表面积函数
double area(double L, double W, double H) {
return (L*H + L*H + W*H) * 2;
}
//定义长方体体积函数
double volume(double L, double W, double H) {
return L*W*H;
}
请输入长方体的长:
3.4
请输入长方体的宽:
2
请输入长方体的高:
3.3
成员方法获取的长方体表面积为:58.08
成员方法获取的长方体体积为:22.44
使用全局函数获取的长方体表面积为:58.08
使用全局函数获取的长方体体积为:22.44
请按任意键继续. . .
2. 圆与点的位置关系案例
- 定义圆类
- 定义点类
- 使用类成员方法判断圆与点的关系
- 使用全局函数判断圆与点的关系
#include <iostream>
using namespace std;
#include <cmath>
//定义点类
class Point {
private:
//成员属性
double p_X;
double p_Y;
public:
//成员方法
//设置点的坐标
void setp_X(double x) {
p_X = x;
}
void setp_Y(double y) {
p_Y = y;
}
//返回点的坐标
double getp_X() {
return p_X;
}
double getp_Y() {
return p_Y;
}
};
//定义圆类
class Circle {
private:
//成员属性
double c_X;
double c_Y;
double c_R;
public:
//成员方法
//设置圆的圆心坐标
void setc_X(double x) {
c_X = x;
}
void setc_Y(double y) {
c_Y = y;
}
//获取圆的圆心坐标
double getc_X() {
return c_X;
}
double getc_Y() {
return c_Y;
}
//设置圆的半径
void setc_R(double r) {
c_R = r;
}
//返回圆的半径
double getc_R() {
return c_R;
}
//判断点与圆的关系
void relationship(Point &P) {
double temp = pow((P.getp_X() - c_X),2)+ pow((P.getp_Y() - c_Y),2) - pow(c_R,2);
if (temp == 0)
cout << "该点在圆上。" << endl;
else if (temp > 0)
cout << "该点在圆外。" << endl;
else
cout << "该点在圆内。" << endl;
}
};
//声明全局函数判断点和圆的关系
void relationship(Circle &C, Point &P);
int main() {
//从键盘获取圆和点
cout << "请输入圆心的横坐标:" << endl;
double c_X;
cin >> c_X;
cout << "请输入圆心的纵坐标:" << endl;
double c_Y;
cin >> c_Y;
cout << "请输入圆的半径:" << endl;
double c_R;
cin >> c_R;
cout << "请输入点的横坐标:" << endl;
double p_X;
cin >> p_X;
cout << "请输入点的纵坐标:" << endl;
double p_Y;
cin >> p_Y;
//实例化圆
Circle C1;
C1.setc_X(c_X);
C1.setc_Y(c_Y);
C1.setc_R(c_R);
//实例化点
Point P1;
P1.setp_X(p_X);
P1.setp_Y(p_Y);
cout << "通过圆类的成员方法判断的圆与点的结果:" << endl;
C1.relationship(P1);
cout << "通过全局函数判断的圆与点的结果:" << endl;
relationship(C1, P1);
system("pause");
return 0;
}
//定义判断圆和点关系的全局函数
void relationship(Circle &C, Point &P) {
double temp = pow((P.getp_X() - C.getc_Y()), 2) + pow((P.getp_Y() - C.getc_Y()), 2) - pow(C.getc_R(), 2);
if (temp == 0)
cout << "该点在圆上。" << endl;
else if (temp > 0)
cout << "该点在圆外。" << endl;
else
cout << "该点在圆内。" << endl;
}
请输入圆心的横坐标:
0
请输入圆心的纵坐标:
0
请输入圆的半径:
2
请输入点的横坐标:
0
请输入点的纵坐标:
2
通过圆类的成员方法判断的圆与点的结果:
该点在圆上。
通过全局函数判断的圆与点的结果:
该点在圆上。
请按任意键继续. . .