当前位置:   article > 正文

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

c++类的实例

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

1.1 抽象

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

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

1.2 封装

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

二、类和对象

2.1 类的定义

以时钟为例:

  1. class Clock
  2. {
  3. public:
  4. //时钟的行为——函数成员
  5. void setTime(int newH,int newM,int newS);
  6. void showtime();
  7. private:
  8. //时钟的数据——数据成员
  9. int hour,minute,second;
  10. };

定义类的语法形式如下:

  1. class 类名称
  2. {
  3. public:
  4. //外部接口
  5. protected:
  6. //保护型成员
  7. private:
  8. //私有成员
  9. };

2.2 类成员的访问控制

2.2.1 访问权限

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

2.2.2 struct和class的区别

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

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

2.2.3 数据成员私有化

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

以汽车为例:

  1. class Car
  2. {
  3. public:
  4. //编号:外侧可读可写
  5. //设置编号
  6. void setID(int ID)
  7. {
  8. m_ID=ID;//ID是对外提供的一个公共的成员函数,来给数据成员赋值
  9. }
  10. //获取编号
  11. int getID()
  12. {
  13. return m_ID;
  14. }
  15. //型号:外侧只读
  16. //获取型号
  17. string getmodel()
  18. {
  19. return m_nodel;
  20. }
  21. //功率:外侧只写
  22. //设置功率
  23. //对数据进行有效性检测
  24. void setpower(int power)
  25. {
  26. if(power<0||power>1000)
  27. {
  28. cout<<"请输入合理的数据"<<endl;
  29. return;
  30. }
  31. m_power=power;
  32. }
  33. private:
  34. int m_ID;
  35. string m_model;
  36. int m_power;
  37. };

2.3 对象

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

  • 声明一个对象的格式:
  1. //和一般变量相同
  2. 类名 对象名;
  3. Car mycar1;
  4. Car mycar2;

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

  • 访问对象的成员

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

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

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

2.4 类的成员函数

2.4.1 成员函数的实现

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

  1. 返回值类型 类名::函数成员名(参数表)
  2. {
  3.         函数体
  4. }
  1. void Car::set(int ID,string model, int power, double price, string color)
  2. {
  3. m_ID = ID;
  4. m_Model = model;
  5. m_Power = power;
  6. m_Price = price;
  7. m_Color = color;
  8. }
  9. void Car::Display()
  10. {
  11. cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率 为" <<m_Power << "马力,价格为 " << m_Price << "元\n";
  12. }

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

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

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

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

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

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

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

2.4.4 内联成员函数

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

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

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

  1. class Car
  2. {
  3. public:
  4. void set(int ID,string model, int power, double price, string color);
  5. void Display()
  6. {
  7. cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
  8. }
  9. private:
  10. int m_ID;//编号
  11. string m_Model;//型号
  12. int m_Power;//功率
  13. double m_Price;//价格
  14. string m_Color;//颜色
  15. };

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

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

三、程序实例

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

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

3.1 实验目的

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

3.2 实验思路

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

  1. class Car
  2. {
  3. public:
  4. //属性设置
  5. void setcar(int ID,string model, int power, double price, string color)
  6. {
  7. m_ID = ID;
  8. m_Model = model;
  9. m_Power = power;
  10. m_Price = price;
  11. m_Color = color;
  12. }
  13. //属性获取
  14. string getModel()
  15. {
  16. return m_Model;
  17. }
  18. string getColor()
  19. {
  20. return m_Color;
  21. }
  22. int getID()
  23. {
  24. return m_ID;
  25. }
  26. int getPower()
  27. {
  28. return m_Power;
  29. }
  30. double getPrice()
  31. {
  32. return m_Price;
  33. }
  34. private:
  35. int m_ID;//编号
  36. string m_Model;//型号
  37. int m_Power;//功率
  38. double m_Price;//价格
  39. string m_Color;//颜色
  40. public:
  41. void Display()
  42. {
  43. cout << "编号" << m_ID << "的" << m_Model << "型汽车的颜色是" << m_Color << ",功率为" << m_Power << "马力,价格为 " << m_Price << "元\n";
  44. }
  45. };

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

  1. double average(double a, double b, double c)//求平均值
  2. {
  3. double val = 0.0;
  4. val = (a + b + c) / 3;
  5. return val;
  6. }
  7. double max(double a, double b, double c) //求最大值
  8. {
  9. double d = (a > b) ? a : b;
  10. double e = (d > c) ? d : c;
  11. return e;
  12. }

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

  1. int main()
  2. {
  3. int ID = 0;
  4. int power = 0;
  5. double price = 0;
  6. string model ;
  7. string color;
  8. double a, b, c;//用来记录三辆车的价格
  9. cout << "请输入第一辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
  10. cin >> ID >> model >> power >> price >> color;
  11. Car c1;
  12. c1.setcar(ID, model, power, price, color);
  13. a = price;
  14. cout << "请输入第二辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
  15. cin >> ID >> model >> power >> price >> color;
  16. Car c2;
  17. c2.setcar(ID, model, power, price, color);
  18. b = price;
  19. cout << "请输入第三辆车的车辆信息:(编号、型号、功率、价格、颜色)" << endl;
  20. cin >> ID >> model >> power >> price >> color;
  21. Car c3;
  22. c3.setcar(ID, model, power, price, color);
  23. c = price;
  24. c1.Display();
  25. c2.Display();
  26. c3.Display();
  27. cout << "平均价格是" << average(a, b, c) << endl;
  28. cout << "最高价格是" << max(a, b, c) << endl;
  29. }

四、总结与反思

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/244295
推荐阅读
相关标签
  

闽ICP备14008679号