[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义

封装是C++面向对象三大特性之一


封装的意义:

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

封装意义一:

  • 在设计类的时候,属性和行为写在一起,表现事物

语法:
class 类名{ 访问权限: 属性 /行为 };

实例1: 求圆的周长

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

//设计一个圆类, 求圆的周长

const double PI = 3.14;

//class 代表设计一个类, 
class Circle
{
	//访问权限
	//公共权限
public:
	//属性
	//半径
	int m_r;

	//行为
	//获取圆的周长
	double calculateZC()
	{
		return 2 * PI * m_r;
	}
};

int main()
{
	//通关圆类 创建具体的圆(对象)
	//实例化(通过一个类 创建一个对象的过程)
	Circle c1;
	c1.m_r = 10;
	cout << "圆的周长为:" << c1.calculateZC() << endl;

	system("pause");
	return 0;
}

输出:

实例2: 定义一个学生类, 输出姓名和学号

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

class Student
{
	

public://公共权限

	//类中的属性和行为 我们统一称为 成员
	//属性	成员属性 成员变量
	//行为	成员函数 成员方法

	//属性
	string m_Name;//姓名
	int m_Id;//学号
	void showStudent()
	{
		cout << "姓名: " << m_Name << "\t学号" << m_Id << endl;

	}
	//给姓名赋值
	void setName(string name,int n)
	{
		m_Name = name;
		m_Id = n;
	}
};



int main()
{
	//实例化
	Student s1,s2;
	//给s1对象赋值
	s1.setName("张三",1);

	s2.m_Name = "李四";
	s2.m_Id = 2;
	//显示学生信息
	s1.showStudent();
	s2.showStudent();

	system("pause");
	return 0;
}

封装意义二:

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

访问权限有三种:

  1. public 公共权限
  2. protected 保护权限
  3. private 私有权限
cpp 复制代码
#include<iostream>
using namespace std;

//访问权限
//1. public 公共权限		成员类内可以访问	类外也可以访问
//2. protected 保护权限		成员类内可以访问	类外不可以访问
//3. private 私有权限		成员类内可以访问	类外不可以访问

class Person
{
	//公共权限
public:
	string m_Name;  //姓名

protected:
	//保护权限
	string m_Car;

private:
	int m_Password;//银行卡密码


public:
	void func() {
		m_Name = "张三";
		m_Car = "拖拉机";
		m_Password = 123456;
	}
};

int main()
{
	//实例化具体对象
	Person p1;
	p1.m_Name = "李四";
	p1.Car = "奔驰";//保护权限内容,类外无法访问
	p1.m_Password = 123;//私有权限内容, 类外无法访问 



	system("pause");
	return 0;
}

4.1.2 struct和class的区别

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

区别:

  • struct 默认权限为公共
  • class 默认权限为私有
cpp 复制代码
#include<iostream>
using namespace std;

class C1
{
	int m_A;//默认私有
};
struct C2
{
	int m_A;//默认共有
};


int main()
{
	//struct 默认权限为公共
	//class 默认权限为私有
	C1 c1;
	cl.m_A = 100;
	C2 c2;
	c2.m_A = 100;


	system("pause");
	return 0;
}

可以看到, 在类or结构体外:

  • c1报错, 无法访问, 是private权限
  • c2可以正常运行, 是public权限

4.1.3 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

cpp 复制代码
#include<iostream>
using namespace std;
/*4.1.3 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性*/

//人类
class Person
{
public:
	//设置姓名
	void setName(string name)
	{
		m_Name = name;

	}
	//获取姓名
	string getName()
	{
		return m_Name;
	}

	//获取年龄
	int getAge()
	{
		return m_Age;
	}
	//设置年龄(0-150)
	void setAge(int age)
	{
		if (age < 0 || age>150)
		{
			cout << "年龄"<<age<< " 输入有误, 赋值失败" << endl;
			return;
		}
		m_Age= age;
	}

	//设置偶像
	void setIdol(string idol)
	{
		m_Idol = idol;
	}
private:
	string m_Name;//可读可写

	int m_Age =18;//只读		也可以写(年龄必须在0-150)

	string m_Idol;//只写
};

int main()
{
	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名: " << p.getName() << endl;

	//年龄设置
	p.setAge(160);
	//获取年龄
	cout << "年龄: " << p.getAge() << endl;

	//偶像设置
	p.setIdol("坤哥");
	//cout << "偶像: " << p.getIdol() << endl;//只写, 外界无法访问


	system("pause");
	return 0;
}

运行结果:

可以看到检测到年龄160不符合要求


4.1.4 类和对象 - 案例1:

设计立方体类(Cube)

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

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
cpp 复制代码
#include<iostream>
using namespace std;



class Cube
{
public:
	//设置长
	void setL(int l)
	{
		m_L = l;
	}
	//获取长	
	int getL()
	{
		return m_L;
	}
	
	//设置宽
	void setW(int w)
	{
		m_W = w;
	}
	//获取宽
	int getW()
	{
		return m_W;
	}

	//设置高
	void setH(int h)
	{
		m_H = h;
	}
	//获取高
	int getH()
	{
		return m_H;
	}
	//获取立方体面积
	int calculateS()
	{
		return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);
	}
	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}

	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube &c)
	{
		if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
		{
			return true;
		}
		return false;
	}




private:
	//属性
	int m_L;
	int m_W;
	int m_H;
};

//利用全局函数判断 两个立方体是否相等
bool isSame(Cube &c1, Cube &c2)
{
	if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
		return true;
	return false;
}


int main()
{
	Cube c1;
	c1.setL(10);
	c1.setH(10);
	c1.setW(10);

	cout << "c1的面积为: " << c1.calculateS() << endl;
	cout << "c1的体积为: " << c1.calculateV() << endl;
	
	//创建立方体c2
	Cube c2;
	c2.setL(10);
	c2.setH(10);
	c2.setW(10);

	cout << "c2的面积为: " << c2.calculateS() << endl;
	cout << "c2的体积为: " << c2.calculateV() << endl;

	//利用全局函数判断
	bool ret = isSame(c1, c2);//注意不要漏数据类型
	if (ret == true)
		cout << "立方体完全相等" << endl;
	else
		cout << "立方体不完全相等" << endl;

	//利用成员函数判断
	ret = c1.isSameByClass(c2);
	if (ret == true)
		cout << "成员函数判断: 立方体完全相等" << endl;
	else
		cout << "成员函数判断: 立方体不完全相等" << endl;
	system("pause");
	return 0;
}

运行结果如下:

设计完成


4.1.5 类和对象 - 案例2:

设计立方体类(Cube)

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

设计方法:

  1. 创建立方体类
  2. 设计属性
  3. 设计行为 求立方体面积和体积
  4. 分别用全局和成员函数 判断立方体是否相等
cpp 复制代码
#include<iostream>
using namespace std;



class Cube
{
public:
	//设置长
	void setL(int l)
	{
		m_L = l;
	}
	//获取长	
	int getL()
	{
		return m_L;
	}
	
	//设置宽
	void setW(int w)
	{
		m_W = w;
	}
	//获取宽
	int getW()
	{
		return m_W;
	}

	//设置高
	void setH(int h)
	{
		m_H = h;
	}
	//获取高
	int getH()
	{
		return m_H;
	}
	//获取立方体面积
	int calculateS()
	{
		return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);
	}
	//获取立方体体积
	int calculateV()
	{
		return m_H * m_L * m_W;
	}

	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube &c)
	{
		if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
		{
			return true;
		}
		return false;
	}




private:
	//属性
	int m_L;
	int m_W;
	int m_H;
};

//利用全局函数判断 两个立方体是否相等
bool isSame(Cube &c1, Cube &c2)
{
	if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
		return true;
	return false;
}


int main()
{
	Cube c1;
	c1.setL(10);
	c1.setH(10);
	c1.setW(10);

	cout << "c1的面积为: " << c1.calculateS() << endl;
	cout << "c1的体积为: " << c1.calculateV() << endl;
	
	//创建立方体c2
	Cube c2;
	c2.setL(10);
	c2.setH(10);
	c2.setW(10);

	cout << "c2的面积为: " << c2.calculateS() << endl;
	cout << "c2的体积为: " << c2.calculateV() << endl;

	//利用全局函数判断
	bool ret = isSame(c1, c2);//注意不要漏数据类型
	if (ret == true)
		cout << "立方体完全相等" << endl;
	else
		cout << "立方体不完全相等" << endl;

	//利用成员函数判断
	ret = c1.isSameByClass(c2);
	if (ret == true)
		cout << "成员函数判断: 立方体完全相等" << endl;
	else
		cout << "成员函数判断: 立方体不完全相等" << endl;
	system("pause");
	return 0;
}

运行结果如下:

设计完成

相关推荐
XH华7 分钟前
初识C语言之二维数组(下)
c语言·算法
南宫生28 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_40 分钟前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
高山我梦口香糖44 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
落魄君子1 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨1 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡1 小时前
滑动窗口 + 算法复习
数据结构·算法
信号处理学渣1 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客1 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin1 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin