当前位置:   article > 正文

C++复习 -- 类的实现

C++复习 -- 类的实现

类:

概念

C++ 中的类(class)是一种编程结构,用于创建对象。

这些对象可以拥有属性(即数据成员)和行为(即成员函数或方法)。类的概念是面向对象编程的核心之一,其主要目的是将数据和与数据相关的操作封装在一起。例如,如果你有一个“汽车”类,它可能包含颜色、品牌、型号等属性(数据成员),以及启动、停止、加速等行为(成员函数)。每当你基于这个类创建一个对象时,你就有了一个具体的汽车,具有这些属性和行为。


C++ 类的基本结构:


1. 数据成员(Attributes):定义类的属性。这些是类内部的变量,用于存储对象的状态。
2. 成员函数(Methods):定义类的行为。这些是可以操作对象的数据成员的函数。
3. 构造函数和析构函数:特殊的成员函数。构造函数在创建对象时自动调用,用于初始化对象。析构函数在对象销毁时调用,用于执行清理操作。
4. 访问修饰符:如 public , private , protected ,用于控制对类成员的访问权限。例如, public成员可以在类的外部访问,而 private 成员只能在类内部访问。
5. 继承:允许一个类继承另一个类的特性。这是代码重用和多态性的关键。
通过这些特性,C++ 类提供了一种强大的方式来组织和处理数据,使得代码更加模块化、易于理解和维护。


===============================================
结构体 -> 结构体变量 

类 -> 对象

二者都是抽象 转变为具象


==========================

通过结构体引入类

更详细的内容请看这篇: 


C语言 + 结构体实现:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5. struct Car{ //汽车“类”
  6. char *color; //颜色
  7. char *brand; //品牌
  8. char *type; //车型
  9. int year; //年限
  10. void (*printCarInfo)(char *color,char *brand,char *type, int year); //函数指针,指向车介绍函数
  11. void (*carRun)(char *type); //函数指针,指向车运行的函数
  12. void (*carStop)(char *type); //函数指针,执行车停止的函数
  13. };
  14. void bwmThreePrintCarInfo(char *color,char *brand,char *type, int year)
  15. {
  16. printf("车的品牌是:%s, 型号是: %s, 颜色是:%s,上市年限是%d\n",brand,type,color,year);
  17. }
  18. void A6PrintCarInfo(char *color,char *brand,char *type, int year)
  19. {
  20. printf("车的品牌是:%s,型号是: %s, 颜色是:%s, 上市年限是%d\n",brand,type,color,year);
  21. }
  22. int main()
  23. {
  24.     struct Car BWMthree;
  25.     BWMthree.color = "白色";
  26.     BWMthree.brand = "宝马";
  27.     BWMthree.type = "3系";
  28.     BWMthree.year = 2023;
  29.     BWMthree.printCarInfo = bwmThreePrintCarInfo; // 给结构体里面的函数指针对象传递函数
  30.     BWMthree.printCarInfo(BWMthree.color,BWMthree.brand,BWMthree.type,BWMthree.year);
  31.     struct Car *AodiA6;// 不能直接 调用指针,要先申请内存空间不然,会野指针,爆段错误
  32.     AodiA6 = (struct Car*)malloc(sizeof(struct Car));
  33.     AodiA6->color = "黑色";
  34.     AodiA6->brand = "奥迪";
  35.     AodiA6->type = "A6";
  36.     AodiA6->year = 2008;
  37.     AodiA6->printCarInfo = A6PrintCarInfo;
  38.     AodiA6->printCarInfo(AodiA6->color,AodiA6->brand,AodiA6->type,AodiA6->year);
  39.     return 0;
  40. }


=========================================


与C++实现的区别:


C++ 和C  语言的结构体能混着用,无非 就是常量字符串,C语言 的类型是 char * ,而C++是 string
C ++ 里面不用 malloc 去申请空间实例化指针,直接把struct 改为class,为类创建对象,调用new函数来实例化
注意: class  类里面的数据不写的情况下是私有权限 -->private -- 不能在main里面调用要声明为 public权限


C++ 的 面向对象的特征更加明显 --> 封装,继承,多态 (权限控制)

C++实现

修改如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6. class Car{ //汽车“类”
  7. public:
  8. string color; //颜色
  9. string brand; //品牌
  10. string type; //车型
  11. int year; //年限
  12. void (*printCarInfo)(string color,string brand,string type, int year); //函数指针,指向车介绍函数
  13. void (*carRun)(string type); //函数指针,指向车运行的函数
  14. void (*carStop)(string type); //函数指针,执行车停止的函数
  15. };
  16. void bwmThreePrintCarInfo(string color,string brand,string type, int year)
  17. {
  18. string str = "车的品牌是:" + brand
  19. + ",型号是: " + type
  20. + ",颜色是:" + color
  21. + ",上市年限是:" + std::to_string(year);
  22. cout << str << endl;
  23. }
  24. void A6PrintCarInfo(string color,string brand,string type, int year)
  25. {
  26. string str = "车的品牌是:" + brand
  27. + ",型号是: " + type
  28. + ",颜色是:" + color
  29. + ",上市年限是:" + std::to_string(year);
  30. cout << str << endl;
  31. }
  32. int main()
  33. {
  34. Car BWMthree;
  35. BWMthree.color = "白色";
  36. BWMthree.brand = "宝马";
  37. BWMthree.type = "3系";
  38. BWMthree.year = 2023;
  39. BWMthree.printCarInfo = bwmThreePrintCarInfo;
  40. BWMthree.printCarInfo(BWMthree.color,BWMthree.brand,BWMthree.type,BWMthree.year)
  41. ;
  42. Car *AodiA6 = new Car();
  43. // AodiA6 = (struct Car*)malloc(sizeof(struct Car));
  44. AodiA6->color = "黑色";
  45. AodiA6->brand = "奥迪";
  46. AodiA6->type = "A6";
  47. AodiA6->year = 2008;
  48. AodiA6->printCarInfo = A6PrintCarInfo;
  49. AodiA6->printCarInfo(AodiA6->color,AodiA6->brand,AodiA6->type,AodiA6->year);
  50. return 0;
  51. }

===========================================

成员函数:

像什么结构体实现的 函数指针实际上还是一个成员变量 --> 指针变量 -->不是真正的成员函数

// 成员函数直接使用类内部的成员变量

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6. class Car{ //汽车“类”
  7. public:
  8. string color; //颜色
  9. string brand; //品牌
  10. string type; //车型
  11. int year; //年限
  12. // 这些函数指针还是成员变量  --> 指针变量
  13. void (*printCarInfo)(string color,string brand,string type, int year); //函数指针,指向车介绍函数
  14. void (*carRun)(string type); //函数指针,指向车运行的函数
  15. void (*carStop)(string type); //函数指针,执行车停止的函数
  16. // 成员函数
  17. void realPrintCarInfo(){
  18.     string str = "车的品牌是:" + brand
  19.     + ",型号是: " + type
  20.     + ",颜色是:" + color
  21.     + ",上市年限是:" + std::to_string(year);
  22.     cout << str << endl;
  23. }
  24. };
  25. void bwmThreePrintCarInfo(string color,string brand,string type, int year)
  26. {
  27. string str = "车的品牌是:" + brand
  28. + ",型号是: " + type
  29. + ",颜色是:" + color
  30. + ",上市年限是:" + std::to_string(year);
  31. cout << str << endl;
  32. }
  33. void A6PrintCarInfo(string color,string brand,string type, int year)
  34. {
  35. string str = "车的品牌是:" + brand
  36. + ",型号是: " + type
  37. + ",颜色是:" + color
  38. + ",上市年限是:" + std::to_string(year);
  39. cout << str << endl;
  40. }
  41. int main()
  42. {
  43. Car BWMthree;
  44. BWMthree.color = "白色";
  45. BWMthree.brand = "宝马";
  46. BWMthree.type = "3系";
  47. BWMthree.year = 2023;
  48. BWMthree.printCarInfo = bwmThreePrintCarInfo;
  49. BWMthree.printCarInfo(BWMthree.color,BWMthree.brand,BWMthree.type,BWMthree.year);
  50. BWMthree.realPrintCarInfo();
  51. Car *AodiA6 = new Car();
  52. // AodiA6 = (struct Car*)malloc(sizeof(struct Car));
  53. AodiA6->color = "黑色";
  54. AodiA6->brand = "奥迪";
  55. AodiA6->type = "A6";
  56. AodiA6->year = 2008;
  57. AodiA6->printCarInfo = A6PrintCarInfo;
  58. AodiA6->printCarInfo(AodiA6->color,AodiA6->brand,AodiA6->type,AodiA6->year);
  59. AodiA6->realPrintCarInfo();
  60. return 0;
  61. }

=====================================================

:: 作用域解析运算符


在 C++ 中,双冒号 :: 称为 "作用域解析运算符"(Scope Resolution Operator)。它用于指定一
个成员(如函数或变量)属于特定的类或命名空间。例如,在类的外部定义成员函数时, :: 用于指明该函数属于哪个类。

=================================


一般用法

 成员函数在类里面定义,在类外实现函数

  1. class Car{ //汽车“类”
  2. public:
  3. string color; //颜色
  4. string brand; //品牌
  5. string type; //车型
  6. int year; //年限
  7. // 这些函数指针还是成员变量  --> 指针变量
  8. void (*printCarInfo)(string color,string brand,string type, int year); //函数指针,指向车介绍函数
  9. void (*carRun)(string type); //函数指针,指向车运行的函数
  10. void (*carStop)(string type); //函数指针,执行车停止的函数
  11. // 成员函数
  12. void realPrintCarInfo();
  13. };
  14. void Car::realPrintCarInfo(){
  15.     string str = "车的品牌是:" + brand
  16.     + ",型号是: " + type
  17.     + ",颜色是:" + color
  18.     + ",上市年限是:" + std::to_string(year);
  19.     cout << str << endl;
  20. }

==========================================

组合:


在 C++中,一个类包含另一个类的对象称为组合(Composition)。这是一种常见的设计模式,用
于表示一个类是由另一个类的对象组成的。这种关系通常表示一种"拥有"("has-a")的关系。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6. class Wl{
  7. public:
  8.     string brand;
  9.     int year;
  10.     void printWheelInfo();
  11. };
  12. class Car{ //汽车“类”
  13. public:
  14. string color; //颜色
  15. string brand; //品牌
  16. string type; //车型
  17. Wl wl;
  18. Wl *pwl;
  19. int year; //年限
  20. // 这些函数指针还是成员变量  --> 指针变量
  21. void (*printCarInfo)(string color,string brand,string type, int year); //函数指针,指向车介绍函数
  22. void (*carRun)(string type); //函数指针,指向车运行的函数
  23. void (*carStop)(string type); //函数指针,执行车停止的函数
  24. // 成员函数
  25. void realPrintCarInfo();
  26. };
  27. void Wl::printWheelInfo()
  28. {
  29.   cout<< "轮胎品牌: "<<brand<<"  轮胎年限:  "<<year<<endl;
  30. }
  31. void Car::realPrintCarInfo(){
  32.     string str = "车的品牌是:" + brand
  33.     + ",型号是: " + type
  34.     + ",颜色是:" + color
  35.     + ",上市年限是:" + std::to_string(year);
  36.     cout << str << endl;
  37. }
  38. void bwmThreePrintCarInfo(string color,string brand,string type, int year)
  39. {
  40. string str = "车的品牌是:" + brand
  41. + ",型号是: " + type
  42. + ",颜色是:" + color
  43. + ",上市年限是:" + std::to_string(year);
  44. cout << str << endl;
  45. }
  46. void A6PrintCarInfo(string color,string brand,string type, int year)
  47. {
  48. string str = "车的品牌是:" + brand
  49. + ",型号是: " + type
  50. + ",颜色是:" + color
  51. + ",上市年限是:" + std::to_string(year);
  52. cout << str << endl;
  53. }
  54. int main()
  55. {
  56. Car BWMthree;
  57. BWMthree.pwl= new Wl();
  58. BWMthree.pwl->brand = "米其林";
  59. BWMthree.pwl->year = 1999;
  60. //BWMthree.wl.brand = "米其林";
  61. //BWMthree.wl.year = 1999;
  62. BWMthree.color = "白色";
  63. BWMthree.brand = "宝马";
  64. BWMthree.type = "3系";
  65. BWMthree.year = 2023;
  66. BWMthree.printCarInfo = bwmThreePrintCarInfo;
  67. BWMthree.printCarInfo(BWMthree.color,BWMthree.brand,BWMthree.type,BWMthree.year);
  68. BWMthree.realPrintCarInfo();
  69. //BWMthree.wl.printWheelInfo();
  70. BWMthree.pwl->printWheelInfo();
  71. Car *AodiA6 = new Car();
  72. // AodiA6 = (struct Car*)malloc(sizeof(struct Car));
  73. AodiA6->pwl= new Wl();
  74. AodiA6->pwl->brand = "马牌";
  75. AodiA6->pwl->year = 2003;
  76. //AodiA6->wl.brand = "马牌";
  77. //AodiA6->wl.year = 2003;
  78. AodiA6->color = "黑色";
  79. AodiA6->brand = "奥迪";
  80. AodiA6->type = "A6";
  81. AodiA6->year = 2008;
  82. AodiA6->printCarInfo = A6PrintCarInfo;
  83. AodiA6->printCarInfo(AodiA6->color,AodiA6->brand,AodiA6->type,AodiA6->year);
  84. AodiA6->realPrintCarInfo();
  85. //AodiA6->wl.printWheelInfo();
  86. AodiA6->pwl->printWheelInfo();
  87. return 0;
  88. }

new 对象的时候不用 ()  也ok,比如Car *AodiA6 = new Car(); --> Car *AodiA6 = new Car;

====================================================


 

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

闽ICP备14008679号