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章)

posted @ 2013-12-14 15:54  曾是土木人  阅读(571)  评论(0编辑  收藏  举报