C ++重载运算符同时作为成员和函数?

时间:2013-03-16 01:19:32

标签: c++ operator-overloading friend friend-function

C ++重载运算符同时作为成员和函数? 我想在这里设置运算符重载。

我对operator + overloading作为朋友和成员的每个案例都没有问题。 但是当我尝试将+操作符作为朋友和朋友作为成员重载时,我得到了错误。

有点困惑。我可能会尝试做一些甚至没有意义的事情? 请检查我的代码,看看我是否可以解决它。 案例3是ERROR生成案例。谢谢!

CASE1 以朋友身份超载:Source.cpp

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

CASE1 以朋友身份超载:Time.h

#pragma once
class Time
{ int hours; int minutes;
public:
Time(void);
~Time(void);
Time(int, int m = 0);
void AddMin(int);
void AddHr(int);
void Reset(int h=0, int m=0);
friend const Time operator+(const Time&amp;, const Time&amp;);
void Show() const; };

CASE1 以朋友身份超载:Time.cpp

#include "Time.h"
#include <iostream>
using namespace std;
Time::Time(void) { hours = minutes = 0;}
Time::~Time(void) {}
Time::Time (int h, int m) { hours =h; minutes = m; }
void Time::AddMin(int m) {minutes+=m; hours+=minutes/60; minutes%= 60; }
void Time::Reset(int h, int m) {hours = h; minutes = m;}

const Time operator+(const Time &amp; t1, const Time&amp; t2) {
Time sum;
sum.minutes = t1.minutes + t2.minutes;
sum.hours = t1.hours + t2.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }
void Time::Show() const
{ cout << hours << " hours, " << minutes << " minutes"; }

CASE2 成员超载:Source.cpp / Time.h / Time.cpp Source.cpp //相同

time.h中

const Time operator+(const Time&amp;) const;  // declaration

Time.cpp

const Time Time::operator+(const Time&amp; t) const {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }  // function definition

CASE 3:错误;试图同时重载operator +作为朋友和成员 Source.cpp //相同

time.h中

friend const Time operator+(const Time&amp;) ;  // declaration

Time.cpp

friend const Time operator+(const Time&amp; t) {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; }  // function definition

1 个答案:

答案 0 :(得分:1)

当您为类型提供操作符重载时,您正在执行的操作是在操作符出现在代码中时提供调用的函数。当只能调用一个定义并且无法选择它时,提供两个定义是没有意义的。

也就是说,你不应该同时拥有成员函数和自由函数重载。

接下来的事情可能实际上是你的困惑,friend的含义是什么。当您提供朋友声明时,您宣布免费功能并授予该功能访问您的私人成员的权限。它是一个自由函数,因此没有隐式this参数,因此:

class X {
   friend X operator+(X const &);
};

将声明operator+的重载,它接受类型X const&的单个参数并返回类型为X的对象。顺便说一下,这是一个有效的运算符,而不是你想要重载的运算符(它是一元operator+,如X x; +x;)。回到上一段,它声明了一个自由函数,而不是一个成员函数,没有隐式this,就像你声明了一样:

class X {};
X operator+(X const &);

因为没有隐式thisminuteshours本身在该函数内部没有意义,并且无法编译。 (定义中的friend关键字也是错误的,friend永远不会出现在类定义之外。

关于friend对于运算符是否有任何特殊含义存在一些混淆,但事实并非如此。它只是影响访问说明符的关键字。如果您可以根据类型的公共接口实现运算符,则首先不应该是friend。因此,如果您在Time中拥有访问者以获取小时和分钟,则可以将运算符实现为:

class Time { // ...
public:
   Time(int hours, int minutes);
   int hours() const;
   int minutes() const;
};
Time operator+(Time const & lhs, Time const & rhs) {
   return Time(lhs.hours()+rhs.hours(), lhs.minutes()+rhs.minutes());
}

没有友谊。

相关问题