【C++】运算符重载 ③ ( 二元运算符重载 | 运算符重载步骤 | 全局函数 实现 运算符重载 | 成员函数 实现 运算符重载 | 友元函数 实现 运算符重载 )

男娘i 2023-10-16 17:30 235阅读 0赞

文章目录

  • 一、运算符重载步骤
    • 1、运算符重载步骤说明
    • 2、运算符重载类
    • 3、全局函数 实现 运算符重载
    • 4、成员函数 实现 运算符重载
    • 5、完整代码示例
  • 二、友元函数实现运算符重载
    • 1、友元函数实现运算符重载
    • 2、代码示例 - 友元函数实现运算符重载

一、运算符重载步骤


1、运算符重载步骤说明

运算符重载步骤 :

  • 首先 , 写出函数名 , 函数名规则为 “ operate “ 后面跟上要重载的运算符 , 如 operate+ 是重载加号运算符 ;
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;

    • 成员函数 : 参数是 1 1 1 个对象的常量引用 , 如 : operate+(const Student& s1)
    • 全局函数 : 参数是 2 2 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 , 如 : 返回值是元素 Student operate+(Student& s1, Student& s2)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;

2、运算符重载类

下面以 Student 类为例 , 编写 成员函数 / 全局函数 实现 运算符重载 代码 ;

  1. class Student
  2. {
  3. public:
  4. // 带参构造函数 , 为参数设置默认值
  5. Student(int age = 1, int height = 1)
  6. {
  7. this->age = age;
  8. this->height = height;
  9. };
  10. public:
  11. // 打印类数据
  12. void print()
  13. {
  14. cout << "age = " << age << " , height = " << height << endl;
  15. };
  16. public:
  17. int age; // 年龄
  18. int height; // 身高
  19. };

3、全局函数 实现 运算符重载

使用 全局函数 实现 运算符重载 , 重载 + 运算符 ;

全局函数 实现 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 “ operate “ 后面跟上要重载的运算符 , 函数名是 operate+ ;

    operate+

  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;

    • 成员函数 : 参数是 1 1 1 个对象的常量引用 , 如 : operate+(const Student& s1)
    • 全局函数 : 参数是 2 2 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)

    operate+(Student& s1, Student& s2)

  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 , 如 : 返回值是元素 Student operate+(Student& s1, Student& s2)

    Student operator+(Student& s1, Student& s2)

  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;

    // 使用 全局函数 实现 运算符重载
    // 重载 + 运算符
    // 实现两个 Student 对象相加
    Student operator+(Student& s1, Student& s2)
    {

    1. Student student(s1.age + s2.age, s1.height + s2.height);
    2. return student;

    };

4、成员函数 实现 运算符重载

使用 成员函数 实现 运算符重载 , 重载 - 运算符 ;

成员函数 实现 运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 “ operate “ 后面跟上要重载的运算符 , 函数名是 operate- ;

    operate-

  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;

    • 成员函数 : 参数是 1 1 1 个对象的常量引用 , 如 : operate+(const Student& s1)
    • 全局函数 : 参数是 2 2 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)

    operator-(Student& s)

  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 ;

    Student operator-(Student& s)

  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;

    public:

    1. // 使用 成员函数 实现 运算符重载
    2. // 重载 - 运算符
    3. // 实现两个 Student 对象相加
    4. Student operator-(Student& s)
    5. {
    6. Student student(this->age - s.age, this->height - s.height);
    7. return student;
    8. };

5、完整代码示例

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. // 带参构造函数 , 为参数设置默认值
  7. Student(int age = 1, int height = 1)
  8. {
  9. this->age = age;
  10. this->height = height;
  11. };
  12. public:
  13. // 打印类数据
  14. void print()
  15. {
  16. cout << "age = " << age << " , height = " << height << endl;
  17. };
  18. public:
  19. // 使用 成员函数 实现 运算符重载
  20. // 重载 - 运算符
  21. // 实现两个 Student 对象相加
  22. Student operator-(Student& s)
  23. {
  24. Student student(this->age - s.age, this->height - s.height);
  25. return student;
  26. };
  27. private:
  28. int age; // 年龄
  29. int height; // 身高
  30. };
  31. // 使用 全局函数 实现 运算符重载
  32. // 重载 + 运算符
  33. // 实现两个 Student 对象相加
  34. Student operator+(Student& s1, Student& s2)
  35. {
  36. Student student(s1.age + s2.age, s1.height + s2.height);
  37. return student;
  38. };
  39. int main() {
  40. // 自定义类型相加
  41. Student s1(10, 120), s2(18, 170);
  42. Student s3, s4, s5;
  43. s3 = s1 + s2;
  44. s3.print();
  45. s4 = s1 - s2;
  46. s4.print();
  47. // 控制台暂停 , 按任意键继续向后执行
  48. system("pause");
  49. return 0;
  50. };

执行结果 :

  1. age = 28 , height = 290
  2. age = -8 , height = -50
  3. 请按任意键继续. . .

在这里插入图片描述

二、友元函数实现运算符重载


1、友元函数实现运算符重载

如果类中的成员都是私有成员 ,

在 运算符重载 中 , 需要访问 私有成员 进行计算 ,

在 成员函数 中 , 可以正常访问 私有成员 ,

但是 在 全局函数 中 , 就无法访问 私有成员 了 ;

此时就需要将 全局函数 声明为 类的 友元函数 , 这样才能再 该 全局函数 ( 友元函数 ) 中访问 私有成员 ;

类中的 成员变量 是 私有成员 ;

  1. private:
  2. int age; // 年龄
  3. int height; // 身高

定义了 全局函数 , 该全局函数中访问了 类中的 私有成员 ,

  1. // 使用 全局函数 实现 运算符重载
  2. // 重载 + 运算符
  3. // 实现两个 Student 对象相加
  4. Student operator+(Student& s1, Student& s2)
  5. {
  6. Student student(s1.age + s2.age, s1.height + s2.height);
  7. return student;
  8. };

需要将 全局函数 声明为 友元函数 , 此时 使用 全局函数 实现 运算符重载 正常执行 ;

  1. private:
  2. friend Student operator+(Student& s1, Student& s2);

2、代码示例 - 友元函数实现运算符重载

代码示例 :

  1. #include "iostream"
  2. using namespace std;
  3. class Student
  4. {
  5. public:
  6. // 带参构造函数 , 为参数设置默认值
  7. Student(int age = 1, int height = 1)
  8. {
  9. this->age = age;
  10. this->height = height;
  11. };
  12. public:
  13. // 打印类数据
  14. void print()
  15. {
  16. cout << "age = " << age << " , height = " << height << endl;
  17. };
  18. public:
  19. // 使用 成员函数 实现 运算符重载
  20. // 重载 - 运算符
  21. // 实现两个 Student 对象相加
  22. Student operator-(Student& s)
  23. {
  24. Student student(this->age - s.age, this->height - s.height);
  25. return student;
  26. };
  27. private:
  28. friend Student operator+(Student& s1, Student& s2);
  29. private:
  30. int age; // 年龄
  31. int height; // 身高
  32. };
  33. // 使用 全局函数 实现 运算符重载
  34. // 重载 + 运算符
  35. // 实现两个 Student 对象相加
  36. Student operator+(Student& s1, Student& s2)
  37. {
  38. Student student(s1.age + s2.age, s1.height + s2.height);
  39. return student;
  40. };
  41. int main() {
  42. // 自定义类型相加
  43. Student s1(10, 120), s2(18, 170);
  44. Student s3, s4, s5;
  45. s3 = s1 + s2;
  46. s3.print();
  47. s4 = s1 - s2;
  48. s4.print();
  49. // 控制台暂停 , 按任意键继续向后执行
  50. system("pause");
  51. return 0;
  52. };

执行结果 :

  1. age = 28 , height = 290
  2. age = -8 , height = -50
  3. 请按任意键继续. . .

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读