zoukankan      html  css  js  c++  java
  • C++:运算符重载

       运算符重载是一种形式的C++多态。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++运算符已经被重载。eg:将*运算符用于地址,将得到存储在这个地址中的值,将他用于2个数字时,得到的将是他们的乘积。C++根据操作数的数目和类型来决定采用哪种操作。

      C++允许将运算符重载扩展到用户定义的类型。例如,允许使用+将两个对象相加。编译器将根据操作数的数目和类型决定使用加法定义。运算符重载可以使代码看起来更自然。例如,将2个数组相加是一种常见的运算。通常,需要使用下面这样的for循环来实现:

    for (int i = 0; i < 20; i++)
        evening[i] = sam[i] + janet[i]; // add element by element

    但在C++中,可以定义一个表示数组的类,并重载+运算符,于是便有这样的语句:

    total = arr1+arr2;

    一个计算时间的例子

     mytime.h

     1 #pragma once
     2 #ifndef MYTIME_H_
     3 #define MYTIME_H_
     4 class Time
     5 {
     6 private:
     7     int hours;
     8     int minutes;
     9 public:
    10     Time(void);
    11     Time(int h,int m);
    12     ~Time(void);
    13     void AddMin(int m);
    14     void AddHr(int h);
    15     void Reset(int h,int m);
    16     void Show();
    17     //const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰
    18     //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数
    19     Time Sum(const Time &t)const;//引用参数t在函数体内不可改变
    20     Time operator + (Time &t)const;//引用参数t在函数体内不可改变
    21 };
    22 #endif

     mytime.cpp

     1 #include "StdAfx.h"
     2 #include <iostream>
     3 #include "MyTime.h"
     4 
     5 Time::Time(void)
     6 {
     7     hours = minutes = 0;
     8 }
     9 Time::Time(int h,int m)
    10 {
    11     hours = h;
    12     minutes = m;
    13 }
    14 
    15 Time::~Time(void)
    16 {
    17 
    18 }
    19 
    20 void Time::AddMin(int m)
    21 {
    22     minutes += m;
    23     hours += minutes/60;
    24     minutes %= 60;
    25 }
    26 
    27 void Time::AddHr(int h)
    28 {
    29     hours += h;
    30 }
    31 
    32 void Time::Reset(int h,int m)
    33 {
    34     hours = h;
    35     minutes = m;
    36 }
    37 
    38 void Time::Show()
    39 {
    40     std::cout<<hours<<" hours"<<","<<minutes<<" minutes"<<std::endl;
    41 }
    42 
    43 Time Time::Sum(const Time &t)const
    44 {
    45     Time sum;
    46     sum.minutes = minutes + t.minutes;
    47     sum.hours = hours + t.hours + sum.minutes/60;
    48     sum.minutes = sum.minutes % 60;
    49     return sum;
    50 }
    51 //重载加法运算符
    52 Time Time::operator+(Time &t)const
    53 {
    54     Time sum;
    55     sum.minutes = minutes + t.minutes;
    56     sum.hours = hours + t.hours + sum.minutes/60;
    57     sum.minutes = sum.minutes % 60;
    58     return sum;
    59 }

    调用

     1 #include "stdafx.h"
     2 #include "MyTime.h"
     3 #include <iostream>
     4 
     5 int _tmain(int argc, _TCHAR* argv[])
     6 {
     7     //比导入整个名称空间更经济
     8     using std::cout;
     9     using std::endl;
    10 
    11     Time planning;
    12     Time coding(2, 50);
    13     Time fixing(5, 55);
    14     Time total;
    15     cout << "planning time = ";
    16     planning.Show();
    17     cout << endl;
    18     cout << "coding time = ";
    19     coding.Show();
    20     cout << endl;
    21     cout << "fixing time = ";
    22     fixing.Show();
    23     cout << endl;
    24     total = coding.Sum(fixing);
    25     cout << "coding.Sum(fixing) = ";
    26     total.Show();
    27     cout << endl;
    28     total = coding + fixing;
    29     cout << "coding + fixing = ";
    30     total.Show();
    31     cout << endl;
    32     getchar();
    33     return 0;
    34 }

    执行结果

    重点讲解

    1.sum函数中将参数声明为引用,可以提高运行效率,节省内存

    2.sum函数中,返回值不能是引用。因为sum对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。使用返回类型Time意味着在删除sum之前构造他的拷贝,调用函数将得到他的拷贝。

    参考资料

    C++ Primer Plus 第六版(第11章)

  • 相关阅读:
    利用cookie改变背景色
    AsyncResult
    元组Tuple
    子查询和高效分页
    事务
    健康亮黄灯 疾病有信号
    每天学点舒压减压秘诀
    药房里买得到的传世名方:新版
    电子设备热循环和振动故障预防
    LED照明应用基础与实践
  • 原文地址:https://www.cnblogs.com/hongfei/p/3474199.html
Copyright © 2011-2022 走看看