C++核心1:封装的意义、类的设计、class与struct的区别、案例练习

内容

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;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值