【C++学习】类与对象(一)——类的定义与对象实例

一、面向对象程序设计的基本特点

1.1 抽象

面向对象方法中的抽象 ,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

一个问题的抽象包括:数据抽象和行为抽象(或被称为功能抽象、代码抽象)。前者描述某类对象的属性和状态,也就是此类对象区别于彼类对象的特征,后者描述的是某类对象共同行为或功能特征。

1.2 封装

封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。

二、类和对象

2.1 类的定义

以时钟为例:

class Clock
{
    public:
//时钟的行为——函数成员
           void setTime(int newH,int newM,int newS);
           void showtime();
    private:
//时钟的数据——数据成员
            int hour,minute,second;
};
   

定义类的语法形式如下:

class 类名称
{
    public:
           //外部接口
    protected:
           //保护型成员
    private:
           //私有成员
};

2.2 类成员的访问控制

2.2.1 访问权限

  •         公共权限   public 类内可以访问 类外可以访问
  •         保护权限   protected 类内可以访问 类外不可以访问
  •         私有权限   private 类内可以访问 类外不可以访问

2.2.2 struct和class的区别

C++中struct和class的唯一区别在于默认的访问权限不同。

  •         struct默认权限为公共
  •         class默认权限为私有

2.2.3 数据成员私有化

  • 内部数据结构不会对该类以外的其余部分造成影响,程序模块之间的相互作用就被降到最低。
  • 自己控制读写权限。
  • 对于写权限,我们可以检测数据的有效性。

以汽车为例:

class Car
{
    public:
//编号:外侧可读可写
//设置编号        
    void setID(int ID)
    {
        m_ID=ID;//ID是对外提供的一个公共的成员函数,来给数据成员赋值
    }
//获取编号
    int getID()
    {
        return m_ID;
    }

//型号:外侧只读
//获取型号
    string getmodel()
    {
        return m_nodel;
    }

//功率:外侧只写
//设置功率
//对数据进行有效性检测
    void setpower(int power)
    {
        if(power<0||power>1000)
            {
                cout<<"请输入合理的数据"<<endl;
                return;
            }
        m_power=power;
    }

    private:
        int m_ID;
        string m_model;
        int m_power;
};

2.3 对象

在C++中。类的对象就是该类的某一特定实体(也称实例)。

  • 声明一个对象的格式:
//和一般变量相同
类名 对象名;

Car mycar1;
Car mycar2;

注意,对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占据一份空间。

  • 访问对象的成员

        访问数据成员的形式是:对象名.数据成员名

        调用函数成员的一般形式是:对象名.函数成员名(参数表)

//访问Car类的对象mycar1的函数成员
mycar1.setID(int ID);
mycar1.getID();

2.4 类的成员函数

2.4.1 成员函数的实现

实现成员函数时要指明类的名称。与普通函数不同,类的成员函数名需要用类名来限制。示例如下: 

返回值类型 类名::函数成员名(参数表)

{

        函数体

}
void Car::set(int ID,string model, int power, double price,  string color)
    {

        m_ID = ID;
        m_Model = model;
        m_Power = power;
        m_Price = price;
        m_Color = color;

    }
void Car::Display()
    {
        cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率 为" <<m_Power << "马力,价格为 " << m_Price << "元\n";
    }

2.4.2 成员函数调用中的目的对象

调用一个成员函数与调用普通函数的差异在于,需要使用"."操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。

mycar.Display();
//mycar是这一调用过程中的目的对象

2.4.3 带默认形参值的成员函数

类成员函数的默认值,一定要写在类定义中,而不能写在类定义之外的函数实现中。

如果调用这个函数没有给出实参,就会使用默认形参值。

class Car
{
public:
void set(int ID=1,string model=A, int power=100, double price=25,  string color=RED);
}

2.4.4 内联成员函数

有的函数被频繁调用,而且代码比较简单,这个函数也可以定义为内联函数(inline function)。

内联函数的声明有两种方式:隐式声明和显式声明

将函数直接放在类体内,这种方法称之为隐式声明:

class Car
{
  public:
       void set(int ID,string model, int power, double price,  string color);
       void Display()
        {
         cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
        }
  private:
    int m_ID;//编号
    string m_Model;//型号
    int m_Power;//功率
    double m_Price;//价格
    string m_Color;//颜色
};

为保证类定义的简洁,可以采用关键字inline显式声明的方式。即在函数体实现时,在函数返回值前类型加上inline:

inline void Car::Display()
        {
         cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
        }

三、程序实例

       声明一个车辆类Car,至少包含编号(ID)、型号(Model)、功率(Power)、颜色(Color)、价格(Price)等私有成员变量。包含必要的公有成员函数,实现属性设置、属性获取、属性显示的功能。get和set函数分别用于获取和设置车辆的成员变量。显示车辆属性信息的成员函数Display,可以输出如下信息:“编号***的***型汽车的颜色是*色,功率为***马力,价格为*”。

       声明至少3个车辆实例对象。提示用户输入全部车辆信息。用户完成输入后,将3辆车的全部信息显示出来,并统计最高价格、平均价格。                                                                   

3.1 实验目的

  • 掌握类的声明和使用,掌握对象的声明和使用。
  • 复习具有不同访问属性的成员的访问方式。
  • 学习类的组合使用方法。

3.2 实验思路

首先声明车辆类car,用set和get函数分别完成设置和获取车辆的成员变量。set充当外部接口,用户可以访问、设定数据。如果不使用set函数,那么这个类无法从外部访问(只读,不可写),一旦被赋值就无法更改。然后声明display函数,车辆类car即完成。

class Car
{
public:
    
    //属性设置
   void setcar(int ID,string model, int power, double price,  string color)
    {
        m_ID = ID;
        m_Model = model;
        m_Power = power;
        m_Price = price;
        m_Color = color;
    }
    

    //属性获取
    string getModel()
    {
        return m_Model;
    }

    string getColor()
    {
        return m_Color;
    }

    int getID()
    {
        return m_ID;
    }

    int getPower()
    {
        return m_Power;
    }

    double getPrice()
    {
        return m_Price;
    }

private:
    int m_ID;//编号
    string m_Model;//型号
    int m_Power;//功率
    double m_Price;//价格
    string m_Color;//颜色

public:
    void Display()
    {
        cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
    }
};

对于计算价格的最大值和平均值,分别声明一个平均值函数(average)和求解最大值(max)函数,然后返回。

double average(double a, double b, double c)//求平均值
{
    double val = 0.0;
    val = (a + b + c) / 3;
    return val;
}

double max(double a, double b, double c) //求最大值
{
    double d = (a > b) ? a : b;
    double e = (d > c) ? d : c;
    return e;
}

主函数中,首先要声明对象,然后建立用户输入界面。这里声明的car类对象是c1,c2,c3,调用setcar函数访问并设置属性。值得一提的是,这里又另外定义了三个double变量a,b,c,用来记录price,从而计算出平均值和最大值。

int main()
{   
    int ID = 0;
    int power = 0;
    double price = 0;
    string model ;
    string color;

    double a, b, c;//用来记录三辆车的价格

    cout << "请输入第一辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
    cin >> ID >> model >> power >> price >> color;
    Car c1;
    c1.setcar(ID, model, power, price, color);
    a = price;

    cout << "请输入第二辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
    cin >> ID >> model >> power >> price >> color;
    Car c2;
    c2.setcar(ID, model, power, price, color);
    b = price;

    cout << "请输入第三辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
    cin >> ID >> model >> power >> price >> color;
    Car c3;
    c3.setcar(ID, model, power, price, color);
    c = price;

    c1.Display();
    c2.Display();
    c3.Display();

    cout << "平均价格是" << average(a, b, c) << endl;
    cout << "最高价格是" << max(a, b, c) << endl;
}

四、总结与反思

初学类与对象,感觉它和结构体比较像,但是两者在访问权限上有所不同。让我感到困难的地方是类中各种函数的声明和调用,以及参数传递(形参、缺省参数)。这大概是因为前一章函数的基础还没有打好,需要再敲敲代码、写写博客加深理解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值