2-4 类和对象:C++封装

目录

一、封装

1. 封装的意义

2. 封装的语法

3、访问权限

4、C++中struct和class的区别、

5、成员属性私有化

二、封装示例

1. 长方体类案例

2. 圆与点的位置关系案例


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
通过圆类的成员方法判断的圆与点的结果:
该点在圆上。
通过全局函数判断的圆与点的结果:
该点在圆上。
请按任意键继续. . .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值