11类和对象

类和对象

1.基本概念

  • 类、对象、成员变量、成员函数
  • 面向对象三大概念
    封装、继承、多态
  • 编程实践
    • 类的定义和对象的定义,对象的使用
    • 求圆形的面积
    • 定义Teacher类,打印Teacher的信息(把类的声明和类的实现分开)

2.类的封装

1.封装(Encapsulation)

  • 封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。
  • 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    备注:有2层含义(把属性和方法进行封装 对属性和方法进行访问控制)

  • C++中类的封装
    * 成员变量,C++中用于表示类属性的变量
    * 成员函数,C++中用于表示类行为的函数

#include "iostream"

using namespace std;

//求圆形的面积
//封装有2层含义
//1 把属性和方法进行封装 
//2 对属性和方法进行访问控制

//3 类的内部和类的外部


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


class MyCircle
{
public:
    double m_r; //属性 成员变量
    double m_s;

public:
    double getR()
    {
        return m_r;
    }
    void setR(double r) //成员函数
    {
        m_r = r;
    }

    double getS()
    {
        m_s = 3.14*m_r*m_r;
        return  m_s;
    }
protected:
private:
};

//类的封装的威力
//类封装的成员变量和成员函数  //可以调用类的成员函数
void printCircle01(MyCircle *pC)
{
    cout<<"r"<<pC->getR()<<endl;
    cout<<"s"<<pC->getS()<<endl;
}

void printCircle02(MyCircle &myc)
{
    cout<<myc.getS()<<endl;
}


void printCircle03(MyCircle myc)
{

}
void main_类的封装第一层含有()
{
    MyCircle c1, c2;
    c1.setR(10);
    cout<<"c1 s: "<<c1.getS()<<endl;

    c1.setR(11);
    printCircle01(&c1);


    c2.setR(20);
    printCircle01(&c2);


    //引用
    printCircle02(c2);

    cout<<"hello...."<<endl;
    system("pause");
}

2.类成员的访问控制

在C++中可以给成员变量和成员函数定义访问级别
Public修饰成员变量和成员函数可以在类的内部和类的外部被访问
Private修饰成员变量和成员函数只能在类的内部被访问

class MyAdvCircle
{
private:
    double m_r2; //没有权限修饰的成员变量 函数 是 默认是私有属性

private:
    double m_r; //属性 成员变量
    double m_s;  //相当于你的银行卡密码

public:
    double getR()  //你的名字
    {
        return m_r;
    }
    void setR(double r) //成员函数
    {
        m_r = r;
    }

    double getS()
    {
        m_s = 3.14*m_r*m_r;
        return  m_s;
    }
};

void main_02()
{
    MyAdvCircle c1, c2;
    //c1.m_r = 10; 
    c1.setR(10);

    system("pause");
}

3.struct和class关键字区别

  • 在用struct定义类时,所有成员的默认属性为public
  • 在用class定义类时,所有成员的默认属性为private
struct AAA
{
    int a;  //用struct关键字定义的类,不写,默认属性是public的.
            //class                                 private

public:
protected:
private:
};

void main()
{
    AAA a1;
    a1.a = 11;

    system("pause");
}

3.示例代码

案例1

  • 设计立方体类(cube),求出立方体的面积和体积
  • 求两个立方体,是否相等(全局函数和成员函数)
#include <iostream>
using namespace std;

class myCube{
public:
    /*分别设置长、宽、高属性*/
    void setA(int tmp)
    {
        m_a = tmp;
    }
    void setB(int tmp)
    {
        m_b = tmp;
    }
    void setC(int tmp)
    {
        m_c = tmp;
    }
    void setABC(int a, int b, int c)//一次性设置三个属性
    {
        m_a = a;
        m_b = b;
        m_c = c;
    }


    /*获取长宽高的值*/
    int getA()
    {
        return m_a;
    }
    int getB()
    {
        return m_b;
    }
    int getC()
    {
        return m_c;
    }


    /*获取面积*/
    int getS()
    {
        m_s = 2 * (m_a*m_b + m_a*m_c + m_b*m_c);
        return m_s;
    }

    /*获取体积*/
    int getV()
    {
        m_v = m_a*m_b*m_c;
        return m_v;
    }


    /*成员函数判断两个立方体是否相等*/
    bool jugeCube(myCube &c2)
    {
        if ((m_a == c2.getA())
            && (m_b == c2.getB())
            && (m_c == c2.getC()))
        {
            cout << "Equal" << endl;
            return true;
        }
        else{
            cout << "Not Equal" << endl;
            return false;
        }
    }

private:
    int m_a;
    int m_b;
    int m_c;

    int m_s;
    int m_v;
protected:

};

/*全局函数判断两个立方体对象是否相等*/
bool jugeCube(myCube &c1, myCube &c2)
{
    if ((c1.getA() == c2.getA())
        && (c1.getB() == c2.getB())
        && (c1.getC() == c2.getC()))
    {
        cout << "Equal"<<endl;
        return true;
    }
    else{
        cout << "Not Equal" << endl;
        return false;
    }
}


int main(void)
{
    myCube v1, v2,v3;

    /*设置第一个立方体长宽高*/
    v1.setABC(1, 2, 3);
    cout << v1.getS() << endl;
    cout << v1.getV() << endl;

    /*设置第二个长方体属性*/
    v2.setABC(1, 2, 3);

    /*成员函数方式判断是否相等*/
    v1.jugeCube(v2);

    /*设置第三个立方体属性*/
    v3.setABC(2,3,4);

    /*全局函数方式判断是否相等*/
    jugeCube(v1, v3);


    system("pause");
    return 0;
}

案例2

  • 设计一个圆形类(AdvCircle),和一个点类(Point),计点在圆内部还是圆外
  • 即:求点和圆的关系(圆内和圆外)

1.点类的头文件

#pragma once

class MyPoint
{
public:
    void setX(int x);
    void setY(int y);
    void setPoint(int x, int y);

    int getX();
    int getY();

protected:
private:
    int m_x;
    int m_y;
};

2.点类的实现文件

#include "myPoint.h"


void MyPoint::setX(int x)
{
    m_x = x;
}
void MyPoint::setY(int y)
{
    m_y = y;
}
void MyPoint::setPoint(int x, int y)
{
    m_x = x;
    m_y = y;
}

int MyPoint::getX()
{
    return m_x;
}
int MyPoint::getY()
{
    return m_y;
}

3.圆类的头文件

#pragma once
#include "myPoint.h"
class MyCircle
{
public:
    void setCentral_X(int x);
    void setCentral_Y(int y);
    void setCentral_R(int r);
    void setCircle(int x,int y,int r);

    bool judge(MyPoint & point);

protected:
private:
    int m_r;
    int central_X;
    int central_Y;
};

4.圆类的实现文件

#include "myCircle.h"

void MyCircle::setCentral_X(int x)
{
    central_X = x;
}
void MyCircle::setCentral_Y(int y)
{
    central_Y = y;
}
void MyCircle::setCentral_R(int r)
{
    m_r = r;
}
void MyCircle::setCircle(int x, int y, int r)
{
    central_X = x;
    central_Y = y;
    m_r = r;
}

bool MyCircle::judge(MyPoint & point)
{
    int dist = 0;
    dist = (point.getX() - central_X)*(point.getX() - central_X) + (point.getY() - central_Y)*(point.getY() - central_Y);
    if (dist < m_r*m_r){
        return true;
    }
    else{
        return false;
    }
}

5.测试文件

#include <iostream>
#include "myPoint.h"
#include "myCircle.h"
using namespace std;



int main(void)
{

    MyCircle c1;
    MyPoint p1;

    c1.setCircle(2, 3, 3);
    p1.setPoint(2, 3);

    if (c1.judge(p1))
        cout << "inside the circle" << endl;
    else
        cout << "beyond the circle" << endl;

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值