zoukankan      html  css  js  c++  java
  • 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;
    }

    小例子:设计立方体类 -----> 求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等

    #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;
    }
    设计立方体类(Cube)

     注意:成员函数:可以用已知调用成员函数,传入未知进行比较。

    哪有什么胜利可言,坚持意味着一切
  • 相关阅读:
    存货核算中的加权平均
    System stored procedures
    javascript中replace与正则表达式
    AfxGetApp 解剖
    MFC中的文字输出
    函数指针的应用
    MFC消息处理与SDK消息处理
    在本地机器上获取root权限
    文件内容读取
    Linux下安装windows系统的方法
  • 原文地址:https://www.cnblogs.com/BY1314/p/12747096.html
Copyright © 2011-2022 走看看