4. 类和对象之封装
前言
C++面向对象的三大特性为:封装、继承、多态
C对C++说你为什么比我麻烦啊?C++说因为我有对象,你没有啊。(好大一口狗粮)
小例子:车可以作为对象,属性有轮胎、方向盘、车灯等等;行为有载人、放音乐等等。
具有相同性质的对象,我们可以抽象的称为类。
4.1 封装
4.1.1 封装的意义
封装意义一
-
将属性和行为作为一个整体,表现生活中的事物
-
将属性和行为加以权限控制
设计一个圆类
#include <iostream> using namespace std; //圆周率 const double PI=3.14; //设计一个圆类,求圆的周长 //圆求周长公式:2*PI*半径 //class 代表设计一个类,类后面紧跟着的就是类的名称 class Circle { //访问权限:公共权限 public: //属性:半径 int m_r; //行为:获取圆的周长 double calculateZC() { return 2*PI*m_r; } }; int main() { //通过圆类,创建按具体的圆 //实例化:通过一个类再创建一个对象 Circle c1; //给圆对象的属性进行赋值 cl.m_r=10; cout <<"圆的周长为:" <<cl.calculateZC() <<endl; system("pause"); return 0; }
例题:设计一个学生类,属性有姓名和学生,可以给姓名和学号赋值,可以给姓名和学号赋值,可以显示i学生的姓名和学号
#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; } void setid(int id){ m_id=id; } }; int main() { Student s1; //创建一个具体学生,实力化对象 //给s1对象 进行属性赋值操作 s1.setname(" 张三 "); s1.setid(1); //显示学生信息 s1.showStudent(); system("pause"): return 0; }
封装意义二
类在设计时,可以把属性和行为放在不同权限下,加以控制,访问权限由以下三种
-
公共权限 public -----> 成员 类内可以访问,类外可以访问
-
保护权限 protected ---->成员 类内可以访问,类外不可以访问,
-
私有权限 private ----> 成员 类内可以访问,类外不可以访问
#include <iostream> using namespace std; //访问权限 //公共权限 public -----> 成员 类内可以访问,类外可以访问 //保护权限 protected----> 成员 类内可以访问,类外不可以访问, //私有权限 private ----> 成员 类内可以访问,类外不可以访问 //保护权限:儿子可以访问父亲中的保护内容 //私有权限:儿子不可以访问父亲中的私有内容 class Person { //公共权限 public: string m_name; //姓名 //保护权限 protected: string m_car; //汽车 //私有权限 private: int m_passward; //银行卡密码 public: void func() { m_name ="张三"; m_car="拖拉机"; m_passward=123456; } }; int main() { //实例化具体对象 Person p1; p1.m_name ="里斯"; // p1.m_car="宾利"; //保护权限类外不可以访问 // p1.m_passward=23564; //私有权限类外不可以访问 p1.func(); system("pause"); return 0; }
4.1.2 struct 和 class 区别
在C++中 struct 和 class唯一区别在于默认的访问权限不同
区别:
-
struct 默认访问权限 ----- 公共
-
class 默认访问权限------ 私有
#include <iostream> using namespace std; class C1 { int m_a; //默认权限是私有 }; struct C2 { int m_b; //默认权限是公有 }; int main() { C1 c1; // c1.m_a=100; //报错,私有成员不能访问 c2.m_b =100; //在struct 默认权限是公有 system("pause"); return 0; }
4.1.3 成员属性设置为私有
优点:
-
将成员属性设置为私有,可以自己控制读写操作
-
对于写权限,我们可以检测数据的有效性
#include <iostream> using namespace std; #include <string> //成员属性设置为私有 //1.可以自己控制写权限 //2.对于写可以检测数据的有效性 //设计人类 class Person { public: //1.设置姓名 void setname(string name) { m_name =name; } //2.获取姓名 string getname() { return m_name; } //3.获取年龄--可读可写,如果想修改(年龄范围必须0~150) int getage() { m_age=0; //初始化为0 return m_age; } void setage(int age) //数据的有效性 { if( age < 0 || age > 150 ) { cout << "请重新输入" << endl; return; //退出函数 } m_age =age; } //4.设置车号---只写不读 int setid(int id) { m_id =id; } private: //姓名 可读可写 string m_name; //年龄 可读可写 int m_age; //车号 只写 //int m_id; }; int main() { Person p; //姓名设置 p.setname("张三"); cout <<"姓名" << p.getname() << endl; //年龄设置 p.setage(1000); cout <<"年龄" << p.getage() << endl; //设置车牌号 p.setid(12355); // cout << "车牌号为:" << p.getid() <<endl; //是不可以访问的,没有接口 system("pause"); return 0; }
小例子:设计立方体类 -----> 求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; //求立方体的面积和体积 //分别用全局函数和成员函数判别两个立方体是否相等 class Cube{ //属性 private: int m_l; //长 int m_w; //宽 int m_h; //高 //行为 public: //设置长 void setl(int l) { m_l=l; } //获取长 int getl() { if(l<0) return; return m_l; } //设置宽 void setw(int w) { m_w=w; } //获取宽 int getw() { if(w<0) return; return m_w; } //设置高 void seth(int h) { m_h=h; } //获取长 int geth() { if(h<0) return; return m_h; } //获取立方体面积 int cslculateS() { return 2*m_l*m_w+2*m_h*m_w+2*m_l*m_h; } //获取立方体体积 int cslculateV() { 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; } }; //利用全局函数判断,两个立方体是否相等 bool isSame(Cube &c1,Cube &c2) //如果值传递会拷贝一份数据,利用引用 { if(c1.getl()==c2.getl() && c1.getw()==c2.getw() && c1.geth()==c2.geh()) return true; return false; } int main() { //创建立方体对象 Cube c1; c1.setl(10); c1.setw(10); c1.seth(10); cout << "c1面积:" <<c1.cslculateS() <<endl; cout << "c1体积:" <<c1.cslculateV() <<endl; //创建第二个立方体 //创建立方体对象 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=isSame(c1,c2) ; //利用成员函数判断是否相等 if (ret) { cout <<"成员函数判断c1与c2相等" <<endl; } else: cout <<"成员函数判断c1与c2不相等" <<endl; system("pause"); return 0; }
注意:成员函数:可以用已知调用成员函数,传入未知进行比较。
哪有什么胜利可言,坚持意味着一切。如想使用请备注转载链接~