[类和对象]1 封装 调用成员函数

时间:2022-09-06 13:09:06

封装有2层含义
1 把属性(数据和变量)和方法(函数和操作)进行封装
2 对属性和方法进行访问控制


3 类的内部和类的外部


4 类的访问控制关键字
  public: 修饰的成员变量和函数 可以在类的内部和类的外部访问
  private: 修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问
  protected: 修饰的成员变量和函数 只能在类的内部被访问,不能在类的外部访问, 用在继承里面


5.用struct关键字定义的类,不写,默认属性是public的.
用class关键字定义的类,不写,默认属性是private的

 

调用成员函数而非全局函数来判断

总结:C里我们如果要实现两个相同类型的对比,则要调用俩次相同的函数来实现,

   而C++使用了类后,先将这种类型抽象出来,然后直接调用成员函数就可以实现

// 案例1    设计立方体类(cube),求出立方体的面积和体积
//            求两个立方体,是否相等(全局函数和成员函数)

#include <iostream>
using namespace std;

class Cube
{
public: //设置和返回ABC 
    void setA(int a)
    {
        m_a = a;
    }
    void setB(int b)
    {
        m_b = b;
    }
    void setC(int c)
    {
        m_c = c;
    }

    void setABC(int a=0, int b=0, int c=0)
    {
        m_a = a;  m_b = b; m_c = c;
    }

    int getA()
    {
        return m_a;
    }
    int getB()
    {
        return m_b;
    }
    int getC()
    {
        return m_c;
    }

public://返回V S 
    int getV()
    {
        m_v = m_a*m_b*m_c;
        return m_v;
    }

    int getS()
    {
        m_s = 2*(m_a*m_b + m_a*m_c + m_b*m_c);
        return m_s;
    }
    
    int judgeCube(Cube &v1, Cube &v2)  //3k
    {
        if ( (v1.getA() == v2.getA()) &&
             (v1.getB() == v2.getB()) &&
             (v1.getC() == v2.getC()) )
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }

    int judgeCube(Cube &v2) //成员函数 函数重载 //4k { //Q:好多人 分不清 这个场景下的m_a 是属于v1 还是 属于v2 //A:自然属于v1,这里只是引用了v2,实则还是在v1里 if ( (this->m_a == v2.getA()) && (this->m_b == v2.getB()) && (this->m_c == v2.getC()) ) { return 1; } else { return 0; } return 0; } private:
    int m_a;
    int m_b;
    int m_c;
    int m_v;
    int m_s;
};


//全局函数
//1相等 0不相等
int judgeCube(Cube &v1, Cube &v2)
{
    if (    (v1.getA() == v2.getA()) &&
            (v1.getB() == v2.getB()) &&
            (v1.getC() == v2.getC())
        )
    {
        return 1;
    }
    else
    {
        return 0;
    }
}


/****************************************
 * 全局函数调用
 *****************************************/
int main01() {
    Cube v1, v2;
    v1.setABC(1, 2, 3);
    cout<<v1.getS()<<endl;
    cout<<v1.getV()<<endl;
    cout<<"hello..."<<endl;

    v2.setABC(1,2,4);

    //判断两个立方体是否相等
    if (judgeCube(v1, v2) == 1)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }
    
    return 0;
}


/****************************************
 * 成员函数调用
 *****************************************/
int main() {
    Cube v1, v2;
    v1.setABC(1, 2, 3);
    cout<<v1.getS()<<endl;
    cout<<v1.getV()<<endl;
    cout<<"hello..."<<endl;
    
    v2.setABC(1,2,4);

    //函数调用 意味着: 去执行 v1对象的类的成员judgeCube
    int tag = v1.judgeCube(v2);  //判断v1立方体 和 v2立方体是否相等 ,通过类的成员函数
    if ( tag == 1 ) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } //判断两个立方体是否相等
    if ( v1.judgeCube(v1, v2) == 1)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }

    return 0;
}