• C++中类的运算符重载教程(一),内附完整代码与解析


    目录:

    一:加号运算符重载

    对+重载函数的理解:(个人理解,仅供参考)

    二:左移运算符的重载

    对<<重载函数的理解(个人理解,仅供参考)

    三:自增运算符重载

    一:加号运算符重载

    在对类进行操作时,如果我们想直接对类的两个实例化对象进行相加(数学计算,加减乘除之类的),那么编译器会报错,告诉我们没有与这些操作数匹配的类型。那么这里就可以用到我们的运算符重载函数了。

     基本格式:

    返回类型 operator 需要重载运算符(函数参数)//  例如这里我们对+运算符进行重载。

    这里我使用的是全局函数实现的+运算符重载,为了可以访问person类的私有属性,需要将该函数声明为person类的友元函数,当然也可以通过成员函数实现。

      如果对友元函数有什么不清楚的可以点击下方链接了解简单易懂的C++类的友元教程(friend)。全局函数做类友元,一个类做另一个类的友元,一个类中某个成员函数做友元。过程中顺序很重要哦。最后附有完整实现代码_来年秋风起^的博客-CSDN博客icon-default.png?t=M5H6https://blog.csdn.net/qq_51004011/article/details/125413810?spm=1001.2014.3001.5501

     

    函数体的实现:

    1. //全局函数实现+运算符重载
    2. person operator+(person& p1, person& p2)
    3. {
    4. person tmp;
    5. tmp.data = p1.data + p2.data;
    6. return tmp;
    7. }
    8. //成员函数做+运算符重载
    9. person person::operator+(person& p1)
    10. {
    11. person tmp;
    12. tmp.data = this->data + p1.data;
    13. }

    在+运算符重载函数被定义好后,就已经可以直接实现此类的两个对象进行相加的操作了。

    当然剩下的,减号,乘除这些都可以这样进行重载。这里就不一一举例了。

    对+重载函数的理解:(个人理解,仅供参考)

    我们在实现完成类的两对象+重载函数后,再直接进行两个对象相加时,+运算符会自动匹配operator+函数,然后p1与p2分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

     

     

    二:左移运算符的重载

    同样,如果我们想直接cout(输出)该类中的数据也不行

     也是因为没有与这些操作数匹配的<<(左移)运算符,这里对<<重载一下就行了。

    函数实现:(注意这个重载函数最好写成全局函数的形式!!!

    1. //全局函数实现左移运算符重载。<<
    2. ostream& operator<<(ostream& cout, person& p)
    3. {
    4. cout << p.data;
    5. return cout;
    6. }

    函数返回类型详解:

     这里的返回类型一定要是ostream&类型的,cout一些数据时,回默认在最后拼接一个endl(换行),所以这里需要将原来的cout类型返回,才能在最后拼接endl。

    这里对>>(右移运算符重载也是可以的,只需要将返回类型与第一个参数类型该为istream即可)

    对<<重载函数的理解(个人理解,仅供参考)

    我们在实现完成类的<<重载函数后,再直接对这个类的对象进行输出,<<运算符会自动匹配operator<<函数,然后cout与p1分别与该函数的第一个,第二个参数类型相匹配,最后成功调用该函数。

     调用完该函数后,函数返回了一个cout的引用,所以在后面可以拼接endl或者其他数据类型。

    三:自增运算符重载

    同样的,我们直接对对象进行++,或者--也不能实现(没有与这些操作数匹配的++运算符)

     所以我们也需要++,进行重载即可,这个函数可以定义为全局函数,或者成员函数都可以。

    (1)前置++重载实现

    前置++,先对变量进行++,然后使用该变量本身。所以这里的返回类型为person&,该对象本身。函数声明为:person& person::operator++();

    1. //++,前置++运算符重载
    2. person& person::operator++()
    3. {
    4. this->data++;
    5. return *this;
    6. }

     可以看到,结果确实如我们预期,可以直接对person类的对象进行++操作。

    (2)后置++重载实现

    后置++,先使用变量中的数据,然后对变量中数据进行++操作。

    所以我们创建一个零时变量来存储原来的值然后对变量中数据进行++操作,这里的返回类型为person,该零时变量函数声明为:person person::operator++(int);加了一个int作为占位参数来区分。

    1. //++后置重载,int占位参数与前置++重载函数区分
    2. person person::operator++(int)
    3. {
    4. person tmp(*this);
    5. this->data++;
    6. return tmp;
    7. }

    对于自减运算符的重载也和上面的实现方式类似,只需要将++该成--即可,这里我就不去实现了。

    最后附上总的实现代码:

    1. #pragma once
    2. #include<iostream>
    3. #include<string>
    4. using namespace std;
    5. class person;
    6. //全局函数实现+运算符重载
    7. person operator+(person &p1,person &p2);
    8. //全局函数实现左移运算符重载。<<
    9. ostream& operator<<(ostream& cout, person& p);
    10. class person
    11. {
    12. friend ostream& operator<<(ostream& cout, person& p);
    13. friend person operator+(person& p1, person& p2);
    14. public:
    15. person();
    16. person(int a);
    17. person(const person& p);
    18. //person operator+(person& p1);
    19. //成员函数实现前置,后置++重载
    20. person& operator++();//前置++重载
    21. person operator++(int);//后置++重载
    22. private:
    23. int data;
    24. };
    25. person::person()
    26. {
    27. ;
    28. }
    29. person::person(int a)
    30. {
    31. this->data = a;
    32. }
    33. person::person(const person& p)
    34. {
    35. this->data = p.data;
    36. }
    37. //全局函数实现+运算符重载
    38. person operator+(person& p1, person& p2)
    39. {
    40. person tmp;
    41. tmp.data = p1.data + p2.data;
    42. return tmp;
    43. }
    44. //成员函数做+运算符重载
    45. //person person::operator+(person& p1)
    46. //{
    47. // person tmp;
    48. // tmp.data = this->data + p1.data;
    49. //}
    50. //全局函数实现左移运算符重载。<<
    51. ostream& operator<<(ostream& cout, person& p)
    52. {
    53. cout << p.data;
    54. return cout;
    55. }
    56. //++,前置++运算符重载
    57. person& person::operator++()
    58. {
    59. this->data++;
    60. return *this;
    61. }
    62. //++后置重载,int占位参数与前置++重载函数区分
    63. person person::operator++(int)
    64. {
    65. person tmp(*this);
    66. this->data++;
    67. return tmp;
    68. }
    69. void test1()
    70. {
    71. person p1(1);
    72. cout << p1 << endl;
    73. //++p1;
    74. p1++;
    75. cout << p1 << endl;
    76. }
    77. int main()
    78. {
    79. test1();
    80. return 0;
    81. }

  • 相关阅读:
    用css画一个半圆弧(以小程序为例)
    『现学现忘』Git基础 — 25、git log命令参数详解
    Spring的循环依赖,到底是什么样的
    Linux中通配符的使用
    【大咖说Ⅱ】中科院信工所研究员林政:大规模预训练语言模型压缩技术
    Go 1.19 发行说明(翻译)
    【C语言】初识指针(二)
    c语言qsort函数使用教程
    【无标题】
    章鱼网络进展月报 | 2022.8.1-8.31
  • 原文地址:https://blog.csdn.net/qq_51004011/article/details/125447648