• C++运算符重载详解


    1.什么是运算符重载

    运算符重载是一种函数重载。

    运算符函数的格式:
    operatorop(argument-list)
    例如,operator+()重载+运算符。
    其中的op,必须是有效的C++运算符,如operator@()会报错,因为C++中没有@运算符。

    2.重载运算符的使用

    如下例所示:

    class Test
    {
    public:
    Test operator+(Test &test);
    }

    调用运算符函数的方式有两种:
    Test t1;
    Test t2;
    1)普通函数调用
    Test t3 = t1.operator+(t2);
    2)运算符方式调用,实质上是调用的1)中的operator+()函数
    Test t3 = t1+t2;

    3.运算符重载示例
    示例代码如下,+运算符重载,计算时分相加。

    mytest.h

    #pragma once
    class Time
    {
    private:
        int hours;
        int minutes;
    public:
        Time();
        Time(int h,int m=0);
        Time operator+(const Time&t) const;
        void Show() const;
    };

    mytest.cpp

    #include "mytest.h"
    #include<iostream>
    Time::Time()
    {
        hours=minutes=0;
    }
    Time::Time(int h,int m)
    {
        hours = h;
        minutes = m;
    }
    Time Time::operator+(const Time &t) const
    {
        Time sum;
        sum.minutes = minutes+t.minutes;
        sum.hours = hours+t.hours+sum.minutes/60;
        sum.minutes%=60;
        return sum;
    }
    void Time::Show() const
    {
        std::cout<<hours<<" hours, "<<minutes<<" minutes"<<std::endl;
    }

    test.cpp

    #include "mytest.h"
    #include <iostream>
    int main()
    {
        Time planning;
        Time coding(2,40);
        Time fixing(5,55);
        Time total;
        
        total = coding+fixing;
    
        std::cout<<"coding+fixing = ";
        total.Show();
    
        total = coding.operator+(fixing);
        std::cout<<"coding.operator+(fixing) = ";
        total.Show();
    
        total = coding+fixing+coding;
        std::cout<<"coding.operator+(fixing) = ";
        total.Show();
        
        return 0;
    }

    输出结果:

    4.运算符重载的注意事项:
    1)重载的运算符必须是有效的C++运算符
    2)运算符操作数至少有一个是用户定义类型
    这是为了防止重载标准类型的运算符
    如将减法运算符(-)重载为计算两个double的和,而不是差,是不被允许的。
    3)不能违反运算符原有的规则
    如求模运算符(%),必须要有两个操作数。
    4)部分运算符不允许重载
    如:sizeof,::,:等

    参考资料:《C++ Primer.Plus》 pp.381-390

  • 相关阅读:
    jvm-类加载
    jvm调优
    jdk8与jdk9的共存
    eclipse的插件开发-启动时间
    斐波那契数列算法逐层优化(C++)
    2G.处女座与复读机(C++)
    3I.处女座的约会(C++)
    3D.处女座的训练(C++)
    3E.处女座和小姐姐(C++)
    3C.处女座点名(C++)
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5576944.html
Copyright © 2020-2023  润新知