c++:类和对象(1),封装

C++面向对象的三大特性:封装、继承、多态。

封装

封装的意义一:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

类中的属性和行为,我们统一称为成员

属性也叫: 成员属性 成员变量

行为也叫: 成员函数 成员方法

格式:

cpp 复制代码
#include<iostream>
using namespace std;
class 类名
{
//访问权限
public:
//属性
//行为

};

例子:

cpp 复制代码
#include<iostream>
using namespace std;

const double pai = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2*Π*半径

//class代表要设计一个类,类后面紧跟着的就是类名称
class Circle
{
	//访问权限
	//公共权限
public:

	//属性
	//半径
	int m_r;

	//行为
	//获取圆的周长
	double zhouchang()
	{
		return 2 * pai * m_r;
	}
};
int main()
{
	//通过圆类 创建具体的(对象)
	//实例化 (通过一个类 创建一个对象的过程)
	Circle c1;
	//给圆对象 的属性进行赋值
	c1.m_r = 10;

	cout << c1.zhouchang() << endl;
	system("pause");
	return 0;
}

封装的意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  1. public 公共权限(成员 在类内可以访问,类外可以访问)
  2. protected 保护权限(成员 在类内可以访问,类外不可以访问)子类可以访问父类
  3. private 私有权限(成员 在类内可以访问,类外不可以访问)子类不能访问父类

(后续更新子类和父类)

例子

类内可以访问示例:

这个段代码可以正常运行,说明三者都可以在类内正常访问。

类外访问示例:

这段代码中,在类外访问公共权限的姓名是正常的,在类外访问保护权限和私有权限的汽车和银行卡密码发生报错,解释了访问权限的作用。


struct和class的区别

在c++中,struct和class唯一的区别 就在于默认的访问权限不同

区别:

  • struct默认权限为公共
  • class默认权限为私有

示例:

下面代码中,我创建了class和struct两端变量。

此时,我们可以看到struct可以正常的进行访问,class报错提示是private成员,不能进行正常访问。


成员属性设置为私有

  • 优点1:将所有成员属性设置为私有,可以自己控制读写权限
  • 优点2:对于写权限,我们可以检测数据的有效性

示例:

通过上面这段代码,我们可以通过选择设置或者不设置对应功能的函数,达到可读可写,只可读,只可写这三种效果。

练习:设计立方体类

  1. 设计立方体类
  2. 求出立方体的面积和体积
  3. 分别用全局函数和成员函数判断两个立方体是否相等

1.设计立方体类, 2.求出立方体的面积和体积

cpp 复制代码
#include<iostream>
using namespace std;
//创建立方体的类
class Cube
{
public:
	//长
	void steL(int l)
	{
		m_L = l;
	}
	int steL()
	{
		return m_L;
	}
	//宽
	void steW(int w)
	{
		m_W = w;
	}
	int steW()
	{
		return m_W;
	}
	//高
	void steH(int h)
	{
		m_H = h;
	}
	int steH()
	{
		return m_H;
	}

	//获取立方体面积
	int calculateS()
	{
		return 2*(m_H * m_L + m_H * m_W + m_L * m_W);
	}

	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}
private:


	int m_L;//长
	int m_W;//宽
	int m_H;//高
};

int main()
{
	//创建一个立方体的对象
	Cube c1;
	c1.steH(10);
	c1.steL(10);
	c1.steW(10);

	cout << c1.calculateS() << endl << c1.calculateV() << endl;
	//第二个立方体
	Cube c2;
	c2.steH(10);
	c2.steL(10);
	c2.steW(10);
}

运行结果:

3.分别用全局函数和成员函数判断两个立方体是否相等

全局函数

cpp 复制代码
//利用全局函数做判断 两个立方体是否相等

//位置:全局
bool isSame(Cube &c1, Cube &c2)
{
//面积和体积同时相等,说明是同一个立方体,长宽高的数值可以互相调换
	if ((c1.calculateS() == c2.calculateS()) && (c1.calculateV() == c1.calculateV()))
	{
		return true;
	}
	return false;
}
cpp 复制代码
bool ret=isSame(c1, c2);
if (ret)
{
	cout << "c1和c2是相等的" << endl;
}
else
{
	cout << "c1和c2是不相等的" << endl;
}

成员函数

cpp 复制代码
bool isSameByClass(Cube&c)
{
	if ((calculateS() == c.calculateS()) && (calculateV() == c.calculateV()))//类内可以访问私有成员
	{
		return true;
	}
	return false;
}

完整代码:

cpp 复制代码
#include<iostream>
using namespace std;
//创建立方体的类
class Cube
{
public:
	//长
	void steL(int l)
	{
		m_L = l;
	}
	int steL()
	{
		return m_L;
	}
	//宽
	void steW(int w)
	{
		m_W = w;
	}
	int steW()
	{
		return m_W;
	}
	//高
	void steH(int h)
	{
		m_H = h;
	}
	int steH()
	{
		return m_H;
	}

	//获取立方体面积
	int calculateS()
	{
		return 2*(m_H * m_L + m_H * m_W + m_L * m_W);
	}

	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}
	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube&c)
	{
		if ((calculateS() == c.calculateS()) && (calculateV() == c.calculateV()))//类内可以访问私有成员
		{
			return true;
		}
		return false;
	}
private:


	int m_L;//长
	int m_W;//宽
	int m_H;//高
};

//利用全局函数做判断 两个立方体是否相等
bool isSame(Cube &c1, Cube &c2)
{
	if ((c1.calculateS() == c2.calculateS()) && (c1.calculateV() == c1.calculateV()))
	{
		return true;
	}
	return false;
}
int main()
{
	//创建一个立方体的对象
	Cube c1;
	c1.steH(10);
	c1.steL(10);
	c1.steW(10);

	cout << c1.calculateS() << endl << c1.calculateV() << endl;
	//第二个立方体
	Cube c2;
	c2.steH(10);
	c2.steL(10);
	c2.steW(10);

//	bool ret=isSame(c1, c2);
	//if (ret)
	//{
	//	cout << "c1和c2是相等的" << endl;
	//}
	//else
	//{
	//	cout << "c1和c2是不相等的" << endl;
	//}
	bool ret = c1.isSameByClass(c2);
	 if (ret)
		{
			cout << "c1和c2是相等的" << endl;
		}
		else
		{
			cout << "c1和c2是不相等的" << endl;
		}
	system("pause");
	return 0;
}
相关推荐
小雅痞几秒前
[Java][Leetcode middle] 209. 长度最小的子数组
java·算法·leetcode
王老师青少年编程3 分钟前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:[NOIP 2018 普及组] 标题统计
c++·字符串·csp·高频考点·信奥赛·专项训练·标题统计
小杍随笔9 分钟前
Rust桌面GUI框架:性能优化与实战避坑指南
开发语言·性能优化·rust
二哈赛车手12 分钟前
新人笔记---项目中简易版的RAG检索后评测指标(@Recall ,Mrr..)实现
java·开发语言·笔记·spring·ai
做时间的朋友。12 分钟前
精准核酸检测
java·数据结构·算法
格林威14 分钟前
3D相机视觉检测:环境光太强,结构光点云全是噪点怎么办?
开发语言·人工智能·数码相机·计算机视觉·3d·视觉检测·工业相机
Rust语言中文社区21 分钟前
【Rust日报】2026-05-02 Temper - 用 Rust 编写的 Minecraft 服务器项目发布 0.1.0 版
运维·服务器·开发语言·后端·rust
冯诺依曼的锦鲤26 分钟前
从零实现高并发内存池:TCMalloc 核心架构拆解
c++·学习·算法·架构
Thomas_Lee_OR29 分钟前
多Agent路径规划 LaCAM for multi-agent path finding (MAPF)
算法·路径规划·仓储机器人·mapf
一切皆是因缘际会37 分钟前
可落地数字生命工程:从记忆厮杀到自我意识觉醒全链路,AGI内生智能硅基生命心智建模
人工智能·深度学习·算法·机器学习·ai·系统架构·agi