c++——类

用程序语言来表示现实事物

C语言思想: 数据与方法分开

//人
typedef struct
{
    char name[32];
    int age;
}Person;

//动物
typedef struct
{
    char name[32];
    int age;
    int type;
}Dog;

void PersonEat(Person *p)
{
    cout<<p->name<<"正在吃饭"<<endl;
}
void DogEat(Dog *d)
{
    cout<<d->name<<"正在吃狗粮"<<endl;
}

void test01()
{
    Person person = {"小明",43};
    Dog dog={"泰迪",6};

    PersonEat(&person);
    DogEat(&dog);

    // 出现一个问题(数据 方法独立  容易造成 方法 调用错误数据)
    DogEat((Dog *)&person);
}

封装

封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和函数增加访问权限。

  1. 把变量(属性)和函数(操作)合成一个整体,封装在一个类中
  2. 对变量和函数进行访问控制
    访问权限:
  3. 在类的内部(作用域范围内),没有访问权限之分,所有成员可以相互访问
  4. 在类的外部(作用域范围外),访问权限才有意义:public,private,protected
  5. 在类的外部,只有 public 修饰的成员才能被访问,在没有涉及继承与派生时, private 和 protected 是同等级的,外部不允许访问
    在这里插入图片描述

class 类名{//抽象的概念  系统不会为其分配空间
    private://私有 类的外部不可直接访问
    protected://保护 类的外部不可直接访问
    数据
    public://公有 类的外部可以直接访问
    方法   
    //在类的内部 没有权限之分  都可以相互访问
};

class默认是私有的,数据私有,方法公有;
用户可以借助公有方法,间接的操作私有数据。

面向对象程序设计案例

Person类的设计

设计一个Person类,可以添加人的姓名以及年龄,在外界通过公有放法对姓名年龄进行修改

#include <iostream>
#include <string.h>

using namespace std;

class Person
{
private:
    char m_name[32];
    int m_age;
public:
    void initPerson(char *name,int age)//Person的初始化
    {
        if(name != NULL)
            strcpy(m_name,name);
        if(age >0 && age <100)
            m_age = age;
    }
    void setName(char *name)//对名字的写操作
    {
        if(name != NULL)
            strcpy(m_name,name);
    }
    char* getName(void)//对名字的读操作
    {
        return m_name;
    }
    void setAge(int age)//对年龄的写操作
    {
        if(age >0 && age <100)
            m_age = age;
        else
            cout << "age无效" << endl;
    }
    int getAge(void)//对年龄的读操作
    {
        return m_age;
    }
    void showPerson(void)//遍历
    {
        cout << "姓名:" << m_name << ",年龄:" << m_age << endl;
    }

};

int main(int argc, char *argv[])
{
    Person lucy;
    lucy.initPerson("lucy",18);
    lucy.showPerson();
    cout << "姓名:" << lucy.getName() << endl;
    cout << "年龄:" << lucy.getAge() <<endl;
    lucy.setAge(20);
    lucy.showPerson();
    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;
    }
    void setW(int w)
    {
        m_w = w;
    }
    void setH(int h)
    {
        m_h = h;
    }
    //读操作 长宽高
    int getL(void)
    {
        return m_l;
    }
    int getW(void)
    {
        return m_w;
    }
    int getH(void)
    {
        return m_h;
    }
    //立方体面积
    int cubeS(void)
    {
        return 2*(m_l*m_w+m_l*m_h+m_w*m_h);
    }
    //立方体体积
    int cubeV(void)
    {
        return m_l*m_w*m_h;
    }
    //类的内部比较
    bool myCompareCube2(Cube &ob)
    {
        if(m_l == ob.getL() && m_w == ob.getW() && m_h == ob.getH())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

};
//全局函数比较
bool myCompareCube1(Cube &c1,Cube &c2)
{
    if(c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main(int argc, char *argv[])
{
    Cube cube1;
    cube1.setL(10);
    cube1.setW(10);
    cube1.setH(10);
    cout << "面积:" << cube1.cubeS() << endl;
    cout << "体积:" << cube1.cubeV() << endl;

    Cube cube2;
    cube2.setL(15);
    cube2.setW(10);
    cube2.setH(10);

    if(myCompareCube1(cube1,cube2) == true)
    {
        cout << "相等" << endl;
    }
    else
    {
        cout << "不相等" << endl;
    }
    Cube cube3;
    cube3.setL(10);
    cube3.setW(10);
    cube3.setH(10);
    if(cube3.myCompareCube2(cube1) == true)
    {
        cout << "相等"<< endl;
    }
    else
    {
        cout << "不相等" << endl;
    }
    return 0;
}

点和圆 类的设计

设计一个圆类和一个点类,计算点和圆的关系

#include <iostream>

using namespace std;
//点类的设计
class Point
{
private:
    int m_x;
    int m_y;
public:
	//坐标的写操作
    void setX(int x)
    {
        m_x = x;
    }
    void setY(int y)
    {
        m_y = y;
    }
    //坐标的读操作
    int getX(void)
    {
        return m_x;
    }
    int getY(void)
    {
        return m_y;
    }
};
//圆类的设计
class Circle
{
private:
    int m_r;
    Point m_p;
public:
	//圆的半径和圆心的写操作
    void setR(int r)
    {
        m_r = r;
    }
    void setP(int x,int y)
    {
        m_p.setX(x);
        m_p.setY(y);
    }
    //圆的半径和圆心的读操作
    int getR(void)
    {
        return m_r;
    }
    Point getP(void)
    {
        return m_p;
    }
    //判断点与圆的位置关系
    void isPointOnCircle(Point &ob)
    {
        int mydistance = (m_p.getX()-ob.getX())*(m_p.getX()-ob.getX())+\
                (m_p.getY()-ob.getY())*(m_p.getY()-ob.getY());
        if(mydistance == m_r*m_r)
        {
            cout<<"点在圆上"<< endl;
        }
        else if(mydistance > m_r*m_r)
        {
            cout<<"点在圆外"<< endl;
        }
        else {
            cout<< "点在圆内"<< endl;
        }
    }
};

int main(int argc, char *argv[])
{
    Circle c1;//实例化一个圆
    c1.setR(5);//设置圆的半径
    c1.setP(0,0);//设置圆心
    
    Point p1;//实例化一个点
    p1.setX(4);
    p1.setY(0);
    c1.isPointOnCircle(p1);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值