1. 封装的意义
封装是C++面向对象的三大特性之一
封装的意义:
1. 将属性和行为作为一个整体,表现生活中的事物
2. 将属性和行为加以权限控制
封装意义之一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限:属性 / 行为 };
示例1:设计一个圆类,求圆的周长
#include<iostream> using namespace std; // 圆周率 const double PI = 3.14; // 1.设计一个圆类,求圆的周长 // 2.圆求周长的公式:2*PI*半径 class Circle { // 访问权限 // 公共权限 public: // 属性 // 半径 int m_r; // 行为 // 获取圆的周长 double caclulateZC() { return 2 * PI * m_r; } }; int main() { // 通过圆类 创建具体的圆(对象) Circle c1; // 给圆对象 的属性进行赋值 c1.m_r = 10; // 2 * PI * 10 = 62.8 cout << "圆的周长为:" << c1.caclulateZC() << endl; system("pause"); return 0; }
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
#include<iostream> using namespace std; #include<string> // 设计一个学生类,属性有姓名和学号 // 可以给姓名和学号赋值,可以显示学生的姓名和学号 // 设计学生类 class Student { public: // 公共权限 // 类中的属性和行为 我们统一称为 成员 // 属性 成员属性 成员变量 // 行为 成员函数 成员方法 // 属性 string m_Name; // 性别 int m_Id; // 学号 // 行为 // 显示姓名和学号 void showStudent() { cout << "性别: " << m_Name << "学号:" << m_Id << endl; } // 给姓名赋值 void setName(string name) { m_Name = name; } }; int main() { // 创建一个具体学生 实例化对象 Student s1; // 给s1对象 进行属性赋值操作 s1.setName("张三"); s1.m_Id = 1; // 显示学生信息 s1.showStudent(); Student s2; s2.setName("李四"); s2.m_Id = 2; s2.showStudent(); system("pause"); return 0; }
类在设计时,可以把属性和行为放在不同的权限,加以控制
访问权限有三种:
1. public 公共权限
2. protected 保护权限
3. private 私有权限
#include<iostream> using namespace std; // 访问权限 // 三种 // 公共权限 public 成员 类内可以访问 类外可以访问 // 保护权限 protected 成员 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容 // 私有权限 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.m_Car = "奔驰"; // 保护权限内容,在类外访问不到 // p1.m_Password = 123; // 私有权限内容,类外访问不到 p1.func(); system("pause"); return 0; }
2. struct和class的区别
唯一区别在于 默认的访问权限不同
区别:
1. struct 默认权限为公有
2. class 默认权限为私有
#include<iostream> using namespace std; class C1 { int m_A; // 默认权限 是 私有 }; struct C2 { int m_A; // 默认权限 是 公共 }; int main() { // struct 和 class区别 // struct 默认权限是 公共 public // class 默认权限是 私有 private C1 c1; // c1.m_A = 100; // 错误 私有权限无法访问 C2 c2; c2.m_A = 100; // 在struct默认的权限为公有,因此可以访问 system("pause"); return 0; }
3. 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,可以检测数据的有效性
#include<iostream> using namespace std; #include<string> // 成员属性设置私有 // 1. 可以自己控制读写权限 // 2. 对于写可以检测数据有效性 class Person { public: // 设置姓名 void setName(string name) { m_Name = name; } // 获取姓名 string getName() { return m_Name; } // 设置年龄(0~150) void setAge(int age) { if (age < 0 || age>150) { cout << "年龄" << age <<"输入有误,赋值失败" << endl; return; } m_Age = age; } // 获取年龄 int getAge() { return m_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(20); //p.m_Age = 20; //获取年龄 cout << "年龄:" << p.getAge() << endl; // 偶像设置 p.setIdol("小明"); // 只写 // cout << "偶像:" << p.getIdol() << endl; // 只写状态 外界访问不到 system("pause"); return 0; }
4. 封装案例学习
练习案例1:设计立方体类
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
#include<iostream> using namespace std; // 立方体类设计 // 1. 创建立方体类 // 2. 设计属性 // 3. 设计行为 获取立方体面积和体积 // 4. 分别利用全局函数和成员函数 判断两个立方体是否相等 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_W * m_H + 2 * m_L * m_H; } // 获取立方体体积 int calculateV() { return m_L * m_W * m_H; } // 利用成员函数判断两个立方体是否相等 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; } } int main() { // 创建第一个立方体对象 Cube c1; c1.setL(10); c1.setW(10); c1.setH(10); cout << "c1的面积为:" << c1.calculateS() << endl; // 结果:600 cout << "c1的体积为:" << c1.calculateV() << endl; // 结果:1000 // 创建第二个立方体对象 Cube c2; c2.setL(10); c2.setW(10); c2.setH(10); // 利用全局函数判断 bool ret = isSame(c1, c2); if (ret) { cout << "c1和c2是相等的" << endl; } else { cout << "c1和c2是不相等的" << endl; } // 利用成员函数判断 ret = c1.isSameByClass(c2); if (ret) { cout << "成员函数判断:c1和c2是相等的" << endl; } else { cout << "成员函数判断:c1和c2是不相等的" << endl; } system("pause"); return 0; }
练习案例2:点和圆的关系
设计一个圆形类(Circle),和一个类(Point),计算点和圆的关系
关系如下:
1. 点在圆上
2. 点在圆外
3. 点在圆内
#include<iostream> using namespace std; // 点和圆关系案例 // 点类 class Point { public: // 设置x void setX(int x) { m_X = x; } // 获取x int getX() { return m_X; } void setY(int y) { m_Y = y; } int getY() { return m_Y; } private: int m_X; int m_Y; }; // 圆类 class Circle { public: // 设置半径 void setR(int r) { m_R = r; } // 获取半径 int getR() { return m_R; } // 设置圆心 void setCenter(Point center) { m_Center = center; } // 获取圆心 Point getCenter() { return m_Center; } private: int m_R; // 半径 // 在类中可以让另一个类 作为本来中的成员 Point m_Center; // 圆心 }; // 判断点和圆关系 void isInCircle(Circle& c, Point& p) { // 计算两点之间距离平方 int distance = (c.getCenter().getX() - p.getX())* (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY()); // 计算半径的平方 int rDistance = c.getR() * c.getR(); // 判断关系 if (distance == rDistance) { cout << "点在圆上" << endl; } else if (distance > rDistance) { cout << "点在圆外" << endl; } else { cout << "点在圆内" << endl; } } int main() { // 创建圆 Circle c; c.setR(10); Point center; center.setX(10); center.setY(0); c.setCenter(center); // 创建点 Point p; p.setX(10); p.setY(10); // 判断关系 isInCircle(c, p); system("pause"); return 0; }