C++核心编程学习4--类和对象--封装
C++面向对象有三大特性:封装、继承和多态。
封装
- 将属性和行为作为一个整体。
- 将属性和行为加以权限控制。
例子1:设计一个圆类
#include <iostream>
using namespace std;// 设计一个圆类,求圆的周长
// 圆周率:3.14
const double PI = 3.14;class Circle {
public:// 属性int m_r; // 半径// 行为// 获取圆的周长double calculateZC() {return 2*PI*m_r;}
};int main() {// 通过圆类创建一个具体的圆(对象)// c就是一个具体的圆(对象) // 通过一个类创建一个圆对象的过程叫做实例化Circle c; //创建对象 局部变量 放在栈上c.m_r = 10; // 给圆对象的半径赋值cout << c.calculateZC() << endl;return 0;
}
例子二 可以通过类的行为 对属性赋值。
#include <iostream>
using namespace std;class Student {
public:// 属性string s_name;int m_id;// 行为// 给姓名和学号进行赋值操作 可以通过类的行为 对属性赋值。void setName(string name) {s_name = name;}void setId(int id) {m_id = id;}// 显示姓名和学号void showInfo() {cout << s_name << " " << m_id << endl;}};int main() {Student s1{"张三", 001};s1.showInfo();Student s2;s2.setName("homo");s2.setId(111);s2.showInfo();
}
封装的访问权限
- public: 公有属性,类外可以访问
- private: 私有属性,类外不可以访问
- protected: 保护属性,类外不可以访问,类内可以访问,子类可以访问
#include <iostream>
using namespace std;class Person {// 姓名 公共权限public:string m_name;// 汽车 保护权限protected:string m_car;// 银行密码 私有权限private:int m_password;// 行为public:void func() {m_name = "张三";m_car = "保时捷";m_password = 123456;}void showInfo() {cout << "姓名:" << m_name << endl;cout << "汽车:" << m_car << endl;cout << "密码:" << m_password << endl;}
};int main() {Person p1;p1.m_name = "homo";cout << p1.m_name << endl;// p1.m_car = "拖拉机"; 报错,保护权限类外无法访问// cout << p1.m_car << endl;// p1.m_password = 987654; 报错,私有权限类外无法访问// cout << p1.m_password << endl;Person p2;p2.func();cout << p2.m_name << endl;// cout << p2.m_car << endl; 同样报错,只能通过公开函数访问// cout << p2.m_password << endl; 同样报错,只能通过公开函数访问p2.showInfo(); // 正确,通过公开函数访问
}
Struct和Class的区别
Struct默认为公有
Class默认为私有
成员属性设置为私有
将所有成员属性私有化,无论是想让他可读可写还是只读状态。
可读可写的成员属性可以在类内实现一个赋值的函数。该赋值函数放在公有权限中,实现类内访问修改值。只读的可以直接写个返回函数,实现读取。
set() get()
#include <iostream>
#include <string>using namespace std;class Person {// 公有方法对私有属性进行控制
public:// 姓名:可读可写// 姓名的写操作:设置姓名void setName(string name) {m_Name = name;}// 姓名的读操作:获取姓名string getName() {return m_Name;}// 年龄设置可读可写// 获取年龄int getAge() {return m_Age;}// 年龄设置可读可写void setAge(int age) {if (age >= 0 && age <= 150)m_Age = age;else {cout << "年龄需要在0-150之间" << endl;return; // 年龄输入有误,返回}}// 情人设置可写void setLover(string lover) {m_lover = lover;}
private:string m_Name; // 姓名 可读可写int m_Age = 18; // 年龄 可读可写,但只能在0-150之间string m_lover; // 情人 只写};int main() {Person p;// 写姓名p.setName("aj");// 读姓名cout << "姓名:" << p.getName() << endl;// 写年龄p.setAge(20);// 读年龄cout << "年龄:" << p.getAge() << endl;return 0;
}
立方体案例
//
// 设计立方体类(Cube),求出立方体的面积和体积。
// 分别用全局函数和成员函数判断两个立方体是否相等。
//
#include <iostream>
using namespace std;class Cube
{// 属性
private:double m_L; //长double m_W; //宽double m_H; //高// 行为
public:// 属性为私有,设置方法获取长宽高// 设置长void setL(double L) {m_L = L;}// 获取长double getL() {return m_L;}// 设置宽void setW(double W) {m_W = W;}// 获取宽double getW() {return m_W;}// 设置高void setH(double H) {m_H = H;}// 获取高double getH() {return m_H;}// 求立方体的面积double getArea() {return 2*(m_L*m_W+m_L*m_H+m_W*m_H);}// 求立方体的体积double Volume() {return m_L*m_W*m_H;}// 成员函数判断两个立方体是否相等bool isEqualByClass(Cube & c) {if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())return true;elsereturn false;}
};// 全局函数:判断两个立方体是否相等
// 思路:分别比较两个立方体的长宽高是否相等,如果相等则认为两个立方体相等
bool isEqual(Cube & c1, Cube & c2) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())return true;elsereturn false;
}int main()
{// 实例化两个立方体Cube c1;c1.setL(10);c1.setW(20);c1.setH(30);cout << "c1的面积为:" << c1.getArea() << endl;cout << "c1的体积为:" << c1.Volume() << endl;cout << "--------------------" << endl;Cube c2;c2.setL(10);c2.setW(20);c2.setH(30);cout << "c2的面积为:" << c2.getArea() << endl;cout << "c2的体积为:" << c2.Volume() << endl;cout << "--------------------" << endl;// 全局函数判断两个立方体是否相等bool a = isEqual(c1, c2);if (a)cout << "两个立方体相等" << endl;elsecout << "两个立方体不相等" << endl;cout << endl;// 成员函数判断两个立方体是否相等bool b = c1.isEqualByClass(c2);if (b)cout << "成员函数判断:两个立方体相等" << endl;elsecout << "成员函数判断:两个立方体不相等" << endl;
}