• 重载与友元


    重载:

    运算符重载是一种形式的C++多态。为什么需要函数重载?为了能实现自定义数据类型的运算(如类),对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。使用重载运算符我们可以将两个对象相加。

    类重载包括成员函数重载和非成员函数重载。

    语法(成员函数重载)

    返回类型 operator重载运算符(参数列表)

    示例:

    1. #include
    2. using namespace std;
    3. class score
    4. {
    5. public:
    6. score()
    7. {
    8. math_score = 60;
    9. };
    10. ~score(){};
    11. score operator*(double num);
    12. void show_score()
    13. {
    14. cout << math_score << endl;
    15. }
    16. private:
    17. double math_score;
    18. };
    19. score score::operator*(double num)
    20. {
    21. score sc;
    22. sc.math_score *= num;
    23. return sc;
    24. }
    25. int main()
    26. {
    27. score sco;
    28. score sc = sco * 1.5;
    29. sco.show_score();
    30. system("pause");
    31. return 0;
    32. }

    定义了一个score类,在成员函数里声明重载了'*'运算符,并在类外进行实现(实现过程很简单)。

    上述代码中score sc = sco * 1.5;的实质是 score sc = sco.operator*(1.5);

    因此这就导致一个很大的问题;

    以上述方式实现score sc = 1.5 * sco;是行不通的

    解决办法是非成员函数重载,即在类外重载。但是有一个问题是,我们的math_score是private的,是访问不到的。于是这时候我们的友元就派上用场了。

    友元有三种:

    友元函数、友元类、友元成员函数

    下面用我们的友元函数解决上面的问题

    1. #include
    2. using namespace std;
    3. class score
    4. {
    5. public:
    6. score()
    7. {
    8. math_score = 60;
    9. };
    10. ~score(){};
    11. score operator*(double num);
    12. friend score operator*(double num, const score sco);
    13. void show_score()
    14. {
    15. cout << math_score << endl;
    16. }
    17. private:
    18. double math_score;
    19. };
    20. score score::operator*(double num)
    21. {
    22. score sc;
    23. sc.math_score *= num;
    24. return sc;
    25. }
    26. score operator*(double num, const score sco)
    27. {
    28. score sc;
    29. sc.math_score *= num;
    30. return sc;
    31. }
    32. int main()
    33. {
    34. score sco;
    35. score sc = 1.5 * sco;
    36. sc.show_score();
    37. system("pause");
    38. return 0;
    39. }

     运行结果:

    可以看到,主要更改部分在于在类里面用freind关键字声明了一个友元函数,并且在类外进行了实现(不用加类名::)。由运行结果可知,用函数友元可以有效的解决上述问题。

    重载的限制:

    常用的友元:重载<<运算符

    在之前,我们向屏幕输出math_score使用了sc.show_score函数。然而如果能直接用cout<

    如果我们使用成员函数重载,那么有上述可知对象将为第一个操作数,这意味着必须这样使用<<:

    trip<

    于是由上面可知,我们可以使用友元来实现非成员函数重载:

    1. #include
    2. using namespace std;
    3. class Time
    4. {
    5. public:
    6. Time(int hour, int minute)
    7. {
    8. this->hour = hour;
    9. this->minute = minute;
    10. }
    11. friend void operator<<(ostream &os, const Time &t);
    12. private:
    13. int hour;
    14. int minute;
    15. };
    16. void operator<<(ostream &os, const Time &t)
    17. {
    18. os << t.hour << " hours, " << t.minute << " minutes" << endl;
    19. }
    20. int main()
    21. {
    22. Time t(5, 4);
    23. cout << t;
    24. system("pause");
    25. return 0;
    26. }

    结果: 

    我们定义了一个Time类,并重载<<运算符来使用cout<

    参考资料:

     C++ Prime Plus 第6版

  • 相关阅读:
    DC系列靶机4通关教程
    回溯算法的奥秘(LeetCode),组合77题、216题、40题
    【Docker】——容器数据卷
    【持续更新中】Dart语言核心知识梳理
    知道创宇上榜CCSIP 2022全景图多个领域
    接口(interface)
    Failed at the node-sass@4.14.1 postinstall script.
    Amine-PEG3-carboxylic acid, hydrochloride;氨基三聚乙二醇羧基,盐酸盐,127457-79-8
    如何诊断服务器关闭的原因
    java-net-php-python-jsp人事管理系统计算机毕业设计程序
  • 原文地址:https://blog.csdn.net/qq_55621259/article/details/126776295