C++--day04

目录: 
1. C的提高 1-131P 时间七天 
2. C++的基础 132-286P 时间八天 
3. C++的提高 287-378P 时间五天 
4. C/C++的数据结构 379-482P 时间五天 
5. C/C++的设计模式基础 483-540P 时间三天

 

视频资料:https://www.bilibili.com/video/av27904891?from=search&seid=10891514449061956870

P160 章小结

C++语言对C语言扩充和增强的几点具体体现

 


P161 C++学习路线和学习标准

面向抽象类(接口)编程

 

 

 


 P162  类的封装和访问控制

类和对象

基本概念

1)类、对象、成员变量、成员函数

2)面向对象三大概念

  封装、继承、多态

3)编程实践

  类的定义和对象的定义,对象的使用

  求圆形的面积

类的封装

1封装(Encapsulation

  A)封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。

  B)封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

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

  C++中类的封装

  成员变量,C++中用于表示类属性的变量

  成员函数,C++中用于表示类行为的函数

2)类成员的访问控制

  在C++中可以给成员变量和成员函数定义访问级别

  Public修饰成员变量和成员函数可以在类的内部和类的外部被访问

  Private修饰成员变量和成员函数只能在类的内部被访问

#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<<"r:"<<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(12);
    PrintCircle02(c2);
    cout<<"hello..."<<endl;
    system("pause");
}
class MyAdvCircle
{
    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()
{
    MyAdvCircle c1;
    //c1.m_r=10;//私有属性不能再外部进行调用
    c1.SetR(12);

    system("pause");
}

 


P163  struct和class关键字的区别

struct AAA
{
    int a;//用struct关键字定义的类,不写默认属性是public
          //  class                          private
public:
protected:
private:
};
void main()
{
    AAA a1;
    a1.a=11;
    system("pause");
}

 


P164  类的声明和类的实现分开

添加类

 

 

 

 

 

 


P165  面向过程向面向对象转变案例1

 

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

class Cube
{
public:
    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:
    int getV()
    {
        m_v=m_a*m_b*m_c;
        return m_v;
    }
    int getS()
    {
        m_s=(m_a*m_b+m_a*m_c+m_b*m_c)*2;
        return m_s;
    }
    int judge(Cube &v1,Cube &v2)
    {
        if ((v1.getA()==v2.getA()) &&(v1.getB()==v2.getB())&&(v1.getC()==v2.getC()) )
        {
            return 1;
        }
        else
        {
            return 0;
        }

    }
    int judge(Cube &v2)//成员函数  函数重载
    {
        //好多人分不清这个场景下的m_a是属于v1的还是v2的
        if((m_a==v2.getA()) &&(m_b==v2.getB())&&(m_c==v2.getC()))
        {
            return 1;
        }
        else
        {
            return 0;
        }
        
    }
protected:
private:
    int m_a;
    int m_b;
    int m_c;
    int m_v;
    int m_s;
};
//全局函数法 PK 成员函数
//1 表示相等 0表示不相等
int judge(Cube &v1,Cube &v2)
{
    if ((v1.getA()==v2.getA()) &&(v1.getB()==v2.getB())&&(v1.getC()==v2.getC()) )
    {
        return 1;
    }
    else
    {
        return 0;
    }
    
}
void main()
{
    Cube v1,v2;
    v1.setABC(2,3,4);
    cout<<v1.getS()<<endl;
    cout<<v1.getV()<<endl;
    //
    v2.setABC(1,2,3);

    //问题抛出 冗余
    //函数调用意味着:去执行 v1对象的类的成judge

    v1.judge(v2);//判断v1立方体和v2立方体是否相等 通过类的成员函数

    //判断两个立方体体积是否相等
    int tag=v1.judge(v1,v2);
    if (tag==1)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }
    if (v1.judge(v1,v2)==1)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }
    system("pause");
}



void main01_全局函数调用()
{
    Cube v1,v2;
    v1.setABC(2,3,4);
    cout<<v1.getS()<<endl;
    cout<<v1.getV()<<endl;
    //
    v2.setABC(1,2,3);
    //判断两个立方体体积是否相等
    if (judge(v1,v2)==1)
    {
        cout<<"相等"<<endl;
    }
    else
    {
        cout<<"不相等"<<endl;
    }
    system("pause");
}

 


 

P166  面向过程向面向对象转变案例2

案例2 设计一个圆形类(AdvCircle),和一个点类(Point),计算点在圆内部还是圆外

即:求点和圆的关系(圆内和圆外)

#include <iostream>
using namespace std;


class MyPoint
{
public:
    void setPoin(int _x1,int _y1)
    {
        x1=_x1;
        y1=_y1;
    }
    int getX1()
    {
        return x1;
    }
    int getY1()
    {
        return y1;
    }
protected:
private:
    int x1;
    int y1;
};
class AdvCircle
{
public:
    void setCircle(int _r,int _x0,int _y0)
    {
        r=_r;
        x0=_x0;
        y0=_y0;
    }
protected:

private:
    int r;
    int x0;
    int y0;
public:
    int judge(MyPoint &myp)
    {
        int dd=(myp.getX1()-x0)*(myp.getX1()-x0)+(myp.getY1()-y0)*(myp.getY1()-y0);
        if (dd<=r*r)
        {
            return 1;//在圆形内部
        }
        else
        {
            return 0;//点在圆形外部
        }
    }
};


void main()
{
    AdvCircle c1;
    MyPoint p1;
    c1.setCircle(2,3,3);
    p1.setPoin(7,7);
    //在圆形1  不在圆内 0
    int tag=c1.judge(p1);
    if (tag==1)
    {
        cout<<"点在圆形内"<<endl;
    }
    else
    {
        cout<<"点在圆形外"<<endl;
    }
    system("pause");
    return;
}

 


 P167  面向过程向面向对象转变案例3

 

 

 

 


P168  作业

作业1:编写C++程序完成以下功能:
1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法; 
2)定义一个圆形类,其属性包括圆心和半径;
3)创建两个圆形对象,提示用户输入圆心坐标和半径,判断两个圆是否相交,并输出结果。

#include <iostream>
#include <math.h>
using namespace std;

class Point
{
public:
    void getPoint(int x,int y)
    {
        p_x=x;
        p_y=y;
    }
    double setPointX()
    {
        return p_x;
    }
    double setPointY()
    {
        return p_y;
    }
private:
    int p_x;
    int p_y;
public:
    double Line(Point &y1)
    {
        double x;
        double y;
        x=p_x-y1.setPointX();
        y=p_y-y1.setPointY();
        return sqrt(x*x+y*y);
    }
};


class Circle
{
public:
    void setKey(int _r,int _x,int _y)
    {
        r=_r;
        p1.getPoint(_x,_y);
    }
    double setX()
    {
        return x0;
    }
    double setY()
    {
        return y0;
    }
    double setR()
    {
        return r;
    }
public:
    bool isIntersection(Circle &another)
    {
        //两个半径之和
        int R=r+another.r;
        //两个圆心之间的距离
        double dis=p1.Line(another.p1);
        if (dis<=R)
        {
            return 1;
        }
        else
        {
            return 0;
        }
        
    }

private:
    int r;
    int x0;
    int y0;
    Point p1;
};


int main()
{
    Point p1,p2;
    int r,x,y;
    p1.getPoint(1,2);
    p2.getPoint(3,4);
    cout<<"两点之间的距离:"<<p1.Line(p2)<<endl;
    

    Circle c1,c2;
    cout << "请输入第一个圆的半径" << endl;
    cin >> r;
    cout << "请输入第一个圆的x" << endl;
    cin >> x;
    cout << "请输入第一个圆的y" << endl;
    cin >> y;
    c1.setKey(r,x, y);


    cout << "请输入第2个圆的半径" << endl;
    cin >> r;
    cout << "请输入第2个圆的x" << endl;
    cin >> x;
    cout << "请输入第2个圆的y" << endl;
    cin >> y;
    c2.setKey(r,x, y);

    if (c1.isIntersection(c2) == 1) {
        cout << "相交" << endl;
    }
    else {
        cout << "不相交" << endl;
    }
    system("pause");
}

作业2:设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算出矩形的面积

#include <iostream>
#include <math.h>
using namespace std;

class Box
{
public:
    void getPoint(int _x1,int _y1,int _x2,int _y2)
    {
        x1=_x1;
        y1=_y1;
        x2=_x2;
        y2=_y2;
    }
    double getS()
    {
        return (x1-x2)*(y1-y2);
    }

private:
    int x1;
    int y1;
    int x2;
    int y2;
};

void main()
{
    Box B1;
    B1.getPoint(1,1,2,2);
    cout<<"这个矩形的面积:"<<B1.getS()<<endl;
    system("pause");
}

 

作业3:定义一个Tree类,有成员ages(树龄),成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值。

//定义一个Tree类,有成员ages(树龄),成员函数grow(int years)对ages加上years,age()显示tree对象的ages的值
#include <iostream>
using namespace std;
class Tree
{
public:
    int grow(int year)
    {
        ages=ages+year;
        return ages;
    }
    int age()
    {
        return ages;
    }
    void setage(int x)
    {
        ages=x;
    }

 


 

posted @ 2019-02-18 17:25  洛水卿卿  阅读(370)  评论(0编辑  收藏  举报