Browse Source

上传文件至 '封装'

Creamo 2 years ago
parent
commit
1aa666697f

+ 116 - 0
封装/1、封装的意义①.cpp

@@ -0,0 +1,116 @@
+//4、类和对象
+
+//C++面向对象的三大特性为 : 封装 、 继承 、 多态
+//C++认为万事万物都皆为对象 , 对象上有其属性和行为
+
+//例如 : 
+
+//人可以作为对象 , 属性有姓名 、 年龄 、 身高 、 体重 ... , 行为有走 、 跑 、 跳 、 吃饭 、 唱歌 。。。
+//车也可以作为对象 , 属性有轮胎 、 方向盘 、 车灯 ... ,行为有载人 、 放音乐 、 空调
+//具有相同性质的对象 , 我们可以抽象为类 , 人属于人类 , 车属于车类
+
+//4.1封装
+//4.1.1封装的意义
+//封装是C++面向对象三大特征之一
+//封装的意义 :
+//⚪将属性和行为作为一个整体 , 表现生活中的食物
+//⚪将属性和行为加以权限
+
+//封装的意义 : 
+//  在设计累的时候 , 属性和行为写在一起,表现事物
+//  语法 :class 类名 { 访问权限 : 属性 / 行为 };
+
+
+#include <iostream>
+
+//实例1 : 设计一个园类 , 求圆的周长
+//求圆周长的公式 : 2 * Π * r
+
+const double Π = 3.14;
+
+//class 代表设计一个类 , 类后面紧跟着的就是类名称
+class Circle
+{
+	//访问权限
+	//公共权限
+public:
+
+	//属性
+	
+	int m_r;
+
+	//行为
+	//获取圆的周长
+	double calculateZC()
+	{
+		return 2 * Π * m_r;
+	}
+
+};
+
+
+//示例2 :设计一个学生类,属性有姓名和学号 , 可以给姓名和学号赋值 , 可以显示学生的姓名和学号
+
+class Student
+{
+	//权限
+public:
+
+
+	//类中的 属性 和 行为 我们统称为 成员
+	//属性   成员属性   成员变量
+	//行为   成员函数   成员方法
+	
+	//属性
+	std::string m_Name;           //姓名
+	int m_ID;                     //学号
+
+	//行为
+	//显示姓名和学号
+	void showStudent()
+	{
+		std::cout << "姓名 :" << m_Name << "学号 :" << m_ID << std::endl;
+	}
+	//给姓名赋值
+	void setName(std::string name)
+	{
+		m_Name = name;
+	}
+	//给学号赋值
+	void setID(int ID)
+	{
+		m_ID = ID;
+	}
+};
+
+int main1()
+{
+	//通过圆类 , 创建一个具体的圆(对象)
+	//实例化   (通过一个类  创建一个对象的过程)
+	Circle c1;
+	//给圆对象 的 属性进行赋值
+	c1.m_r = 10;
+
+	std::cout << "圆的周长为 : " << c1.calculateZC() << std::endl;
+
+	//创建一个具体的学生   实例化对象
+	Student s1;
+	//给s1对象  进行属性赋值操作
+	//s1.m_Name = "张三";
+	s1.setName("张三");
+	//s1.m_ID = 1;
+	s1.setID(1);
+	s1.showStudent();
+	//显示学生信息
+
+	Student s2;
+	s2.m_Name = "李四";
+	s2.m_ID = 2;
+	s2.showStudent();
+
+
+	system("pause");
+
+	return 0;
+
+}

+ 60 - 0
封装/2、封装的意义②.cpp

@@ -0,0 +1,60 @@
+//封装的意义②
+
+//类在设计时,可以把属性和行为放在不同的权限下,加以控制
+//访问权限有三种 :
+
+//① public  公共权限
+//② protected  保护权限
+//③ private  私有权限
+
+
+#include <iostream>
+
+//访问权限
+//三种
+//公共权限   public          成员  类内可以访问   类外也可以访问
+//保护权限   protected       成员  类内可以访问   类外不可以访问    儿子也可以访问父亲中保护的内容
+//私有权限   private         成员  类内可以访问   类外不可以访问    儿子不可以访问父亲的私有内容
+ 
+
+class Person
+{
+public:
+	//公共权限
+	std::string m_Name;       //姓名
+
+protected:
+	//保护权限
+	std::string m_Car;        //汽车
+
+private:
+	//私有权限
+	int m_bankPassword;       //银行密码
+
+public:
+	void func()
+	{
+		m_Name = "张三";
+		m_Car = "拖拉机";
+		m_bankPassword = 123456;
+	}
+
+};
+
+int main2()
+{
+
+	//实例化一个具体的对象
+	Person p1;
+
+	p1.m_Name = "李四";
+	//p1.m_Car = "奔驰";          //保护权限的内容,在类外访问不到
+	//p1.m_bankPassword = 123;   //私有权限内容,类外访问不到
+
+	p1.func();
+
+	system("pause");
+
+	return 0;
+
+}

+ 43 - 0
封装/3、struct和class区别.cpp

@@ -0,0 +1,43 @@
+//4.1.2  struct和class区别
+
+//在C++中 struct 和 class 唯一的区别就在于 默认的访问权限不同
+
+//区别:
+//⚪struct默认权限为公共
+//⚪class 默认权限为私有
+
+#include <iostream>
+
+class C1
+{
+	//默认权限 是 私有 
+	int m_A;
+
+};
+
+struct C2
+{
+	//默认权限 是 公共
+	int m_A;
+
+};
+
+
+int main3()
+{
+	//struct 和 class区别
+	//struct 默认权限是  公共  public
+	//class  默认权限是  私有  private
+
+	C1 c1;
+	//c1.m_A = 100;      //私有权限  在 class  中 类外不可访问
+
+	C2 c2;
+	c2.m_A = 100;        //公共权限  在 struct 中 默认为公共权限
+
+
+	system("pause");
+
+	return 0;
+
+}

+ 87 - 0
封装/4、成员属性设置为私有.cpp

@@ -0,0 +1,87 @@
+//成员属性设置为私有
+
+//优点 1 :将所有成员属性设置为私有,可以自己控制读写权限
+//有点 2 :对于写权限,我们可以检测数据的有效性
+
+
+#include <iostream>
+
+
+//设计人类
+class Person
+{
+public:
+	
+	//设置姓名
+	void setName(std::string name)
+	{
+		m_Name = name;
+	}
+
+	//获取姓名
+	std::string getName()
+	{
+		return m_Name;
+	}
+
+	//获取年龄
+	//年龄可读可写  如果想修改 (年龄的范围必须是 0~150 之间)
+	int getAge()
+	{
+		//m_Age = 0;       //初始化为0岁
+		return m_Age;
+	}
+
+	//设置年龄
+	void setAge(int age)
+	{
+		if (age < 0 || age > 150)
+		{
+			m_Age = 0;
+			std::cout << "你这个老妖精!" << std::endl;
+			return;
+		}
+		m_Age = age;
+	}
+
+	//设置情人
+	void setLover(std::string lover)
+	{
+		m_Lover = lover;
+	}
+
+private:
+	//姓名   可读可写
+	std::string m_Name;
+
+
+	//年龄   只读
+	int m_Age;
+
+	//情人   只写
+	std::string m_Lover;
+
+};
+
+int main4()
+{
+	Person p;
+
+	p.setName("张三");
+	std::cout << "姓名为 :" << p.getName() << std::endl;
+
+	//p.m_Age = 18;
+	//p.setAge(18);
+	p.setAge(18);
+	std::cout << "年龄为 :" << p.getAge() << std::endl;
+
+	//设置情人为苍井
+	p.setLover("苍井");
+	//std::cout << "想知道p的情人是谁?" << p.m_Lover << std::endl;   //是不可以访问到的  只写权限
+
+
+
+	system("pause");
+
+	return 0;
+}

+ 132 - 0
封装/5、封装案例练习:设计立方体类.cpp

@@ -0,0 +1,132 @@
+//练习案例1:设计立方体类
+
+//设计立方体类(Cube)
+//求出立方体的面积和体积
+//分别用全局函数和成员函数判断两个立方体是否相等。
+
+//1、创建立方体类
+//2、设计属性
+//3、设计行为 获取立方体面积和体积
+//4、分别利用全局函数和成员函数  判断两个立方体是否相等
+
+#include <iostream>
+
+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 + 2 * m_H * m_W + 2 * m_L * 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.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
+	{
+		return true;
+	}
+
+	return false;
+}
+
+int main5()
+{
+	//创建立方体对象
+	Cube c1;
+	c1.setL(10);
+	c1.setW(10);
+	c1.setH(10);
+
+	std::cout << "c1的面积为 : " << c1.calculateS() << std::endl;
+	std::cout << "c1的体积为 : " << c1.calculateV() << std::endl;
+
+
+	//创建第二个立方体
+	Cube c2;
+	c1.setL(10);
+	c1.setW(10);
+	c1.setH(10);
+
+	//利用全局函数判断
+	bool ret = isSame(c1, c2);
+	if (ret)
+	{
+		std::cout << "全局函数判断 : c1和c2是相等的" << std::endl;
+	}
+	else
+		std::cout << "全局函数判断 : c1和c2是不相等的" << std::endl;
+
+	//利用成员函数判断
+	ret = c1.isSameByClass(c2);
+	if (ret)
+	{
+		std::cout << "成员函数判断 : c1和c2是相等的" << std::endl;
+	}
+	else
+		std::cout << "成员函数判断 : c1和c2是不相等的" << std::endl;
+
+	system("pause");
+
+	return 0;
+}