首页 > 编程语言 >C++:运算符重载

C++:运算符重载

时间:2022-10-25 22:55:21浏览次数:34  
标签:hours min int C++ 运算符 Time 重载

前言

  重载我们又称之为多态,重载在编程中的用法非常之多,比如最熟悉的函数重载(基于C++开发的capl语言同样支持函数重载)。当然在C++中仍然支持将多态引用到运算符中,例如 * 运算符可以用于地址,也可以用来两数相乘。本质上,C++运算符的重载由操作数类型决定,这类似于函数重载是由形参列表决定。但需要注意的是运算符重载只支持类定义或者结构定义。

	/* *运算符重载 */
	int b = 10;
	int a = 10;
	int* p = &a;// *作用于地址
	int out = *p * b;// *用来相乘
	cout << out << endl;

自定义运算符重载

  运算符重载小白本人(下文及后续其他文章自称本白)认为是一个非常强大好用得功能,其定义方式为 结构名 operateor  运算符  (参数列表) 就拿C++ plus书的例子来说,如果我们定义了A,B,C三个类,并且三个类成员都在public声明了一个整形变量DD,那借用重载+号运算符我们可以直接:

	C=A+B //重载的本质:C.DD=A.DD+B.DD

  可能这样大家看起来还不是很清晰,那借用一个例子我们来完整的看运算符重载到底是怎末实现的:

//头文件
        #pragma once
        #include <iostream>

        using namespace std;

        class Time
        {
        private:
            int hours;
            int min;
        public:
            Time();
            Time(int h, int m = 0);
            ~Time();
            void Add_min(int m);//增加分钟
            void Add_Hou(int h);//增加小时
            void Reset(int h=0,int m=0) ;//重置类的参数
            Time Sum(const Time& t) const;//两个类的时间相加赋值给第三个类,注意返回值不要引用,因为函数执行完毕后会清除创建的Sum类对象
            void Show() const;//展示成员值
        };

警告:不要返回指向局部变量的引用。函数执行完毕后,局部变量和临时对象将消失(static除外),引用将指向不存在的数据!

        //类成员函数定义CPP文件
        #include "运算符重载.h"

        Time::Time()
        {
            hours = min = 0;
        }

        Time::Time(int h, int m)
        {
            hours = h;
            min = m;
        }

        Time::~Time()
        {

        }

        void Time::Add_min(int m) //增加分钟
        {
            int h_add=0;
            h_add = (m + min) / 60;
            hours += h_add;
            min = (m + min) % 60;
        }

        void Time::Add_Hou(int h) //增加小时
        {
            hours += h;
            if (hours > 24)
            {
                cout << "ERROR HOURS! PLEASE INPUT AGAIN!" << endl;
                hours -= h;
            }
        }
        void Time::Reset(int h, int m) //重置类的参数
        {
            min = m;
            hours = h;
        }

        Time Time::Sum(const Time& t) const//两个类的时间相加赋值给第三个类并返回
        {
            Time sum;
            sum.min = (this->min + t.min);
            sum.hours = this->hours + t.hours + sum.min/60;
            sum.min = sum.min % 60;
            return sum;
        }

        void Time::Show() const//展示成员值
        {
            cout << "hours#: " << this->hours << endl;
            cout << "minutes#: " << this->min << endl;
        }
        //Main函数文件
        #include <iostream>
        #include "运算符重载.h"

        using namespace std;

        int main(void)
        {
            Time timeSum;//用于存放总和
            Time time2(10,23);
            Time time3(5,40);
            //没有运算符重载的时候
            cout << "没有运算符重载" << endl;
            timeSum = time2.Sum(time3);
            timeSum.Show();
            return 0;
        }

   运行结果如下:

  可以看出不借助运算符重载我们必须自己顶一个Sum函数来进行两个类成员的变量相加,但是当调用时就显得有点臃肿,如果我们使用 + 运算符重载呢?

    只要在类声明时声明一个运算符重载,并且定义好其重载的具体对象:

        Time Time::operator+(const Time& t) const//定义一个+运算符重载
        {
            Time sum;
            sum.min = (this->min + t.min);
            sum.hours = this->hours + t.hours + sum.min / 60;
            sum.min = sum.min % 60;
            return sum;
        }

  然后运行main函数:

        #include <iostream>
        #include "运算符重载.h"

        using namespace std;

        int main(void)
        {
            Time timeSum;//用于存放总和
            Time time2(10,23);
            Time time3(5,40);
            //没有运算符重载的时候
            cout << "没有运算符重载" << endl;
            timeSum = time2.Sum(time3);
            timeSum.Show();

            //运算符重载
            cout << "运算符重载" << endl;
            timeSum = time3 + time2;
            timeSum.Show();

            return 0;
        }

  运行结果如下:

结论  

  其实不难发现,这里的+其实对于类来说就是一个成员函数,只不过+号只是简写罢了:

        timeSum = time3.operator+(time2);

   这也就说明了运算符重载必须是类或者结构,因为operator本质就是一个函数,因此不接受基本变量进行重载!

标签:hours,min,int,C++,运算符,Time,重载
From: https://www.cnblogs.com/YiMo9929/p/16826703.html

相关文章

  • P7911 网络连接评论及c++题解
    P7911网络连接1.原题链接root2.评论下位黄的水平前置知识:sscanf()函数,sprintf()函数,map<>当然,不会sscanf()和sprintf()也有解法,详见解法13.解法解法1#inclu......
  • 实验3 数组、指针与现代c++标准库
    实验任务5#include"Info.hpp"#include<iostream>#include<string>#include<vector>intmain(){strings1,s2="continue";inti=0,n=0;intcon......
  • C++ 面向对象高级开发 基础篇(二)
    操作符重载C2就是this传递者不用知道是否returnbyreference 非成员函数(全局函数)的操作符重载(有几种用法就写几种重载)不能使用returnbyreference因为他们得......
  • C++ STL库_vector
    1.vector的初始化方式vectora(10);定义10个整形元素的向量(每个元素的初值为0)vectora(10,1);定义10个整形元素的向量(每个元素的初值为1)vectora(b);用b向量创建a向量,整体......
  • C++服务器开发精髓 电子书 pdf
    作者:张远龙出版社:电子工业出版社 链接:C++服务器开发精髓  本书从操作系统原理角度讲解进行C++服务器开发所需掌握的技术栈。全书总计9章,第1~2章讲解C++11/14/......
  • C++ 面向对象高级开发 基础篇(一)
    C与C++的结构 C++举例   基本结构:   C与C++的输出    防御式声明   头文件声明   Class的声明 模板   访问......
  • vscode调试C++代码,及makefile
      launch.json{//使用IntelliSense了解相关属性。//悬停以查看现有属性的描述。//欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?......
  • (C++) 类与 static_cast 与 dynamic_cast
    static_caststatic_cast相当于C语言里面的强制转换,适用于:用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表......
  • C/C++飞机订票系统
    C/C++飞机订票系统设计一个飞机订票系统,通过此系统可以实现如下功能:(1)录入:可以录入航班信息(具体内容自定);(2)查询:可以查询某个航线的情况;(3)订票:可以订票,如......
  • 实验3 数组、指针与现代C++标准库
    实验任务5:info.hpp文件源码 1#pragmaonce2#include<string>3#include<iostream>4#include<iomanip>5usingnamespacestd;6classinfo{7pub......