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)

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

猜你喜欢

转载自www.cnblogs.com/BY1314/p/12747096.html