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&, const Time&);
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 & t1, const Time& 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&) const; // declaration
Time.cpp
const 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; } // function definition
CASE 3:错误;试图同时重载operator +作为朋友和成员 Source.cpp //相同
time.h中
friend const Time operator+(const Time&) ; // declaration
Time.cpp
friend const Time operator+(const Time& t) {
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum; } // function definition
答案 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 &);
因为没有隐式this
,minutes
和hours
本身在该函数内部没有意义,并且无法编译。 (定义中的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());
}
没有友谊。