我在c ++上重载了+运算符,如下所示:
#include <iostream>
class Cent
{
private:
int m_nCent;
public:
Cent(){ };
Cent(int n);
int getCent() const;
void setCent(int);
friend Cent operator+(const Cent &c1, const Cent &c2);
friend Cent operator+(const Cent &c1, const int);
};
Cent::Cent(int n)
{
setCent(n);
}
int Cent::getCent() const
{
return Cent::m_nCent;
}
void Cent::setCent(int n)
{
Cent::m_nCent = n;
}
Cent operator+(const Cent &c1, const Cent &c2)
{
return Cent(c1.getCent() + c2.getCent());
}
Cent operator+(const Cent &c1, const int n)
{
return Cent(c1.getCent() + n);
}
int main()
{
Cent c1(5);
Cent c2(4);
Cent sum;
sum = c1 + c2;
std::cout << sum.getCent() << std::endl;
sum = c1 + 7;
std::cout << sum.getCent() << std::endl;
sum = 9 + c1;
std::cout << sum.getCent() << std::endl;
return 0;
}
基于这个代码,我必须使用两个函数重载+运算符,一个函数用于(Cent,int),另一个函数用于(int,int),我只实现(Cent,int)情况但是在main我使用+运算符对于(int,Cent)而且它的工作真的很棒!对我来说有什么不对?
我在Linux 3.13上使用GCC v4.8.2。
答案 0 :(得分:8)
您有一个隐式转换构造函数Cent(int)
。 9 + c1
来电将展开为Cent(9) + c1
并调用Cent, Cent
超载。
答案 1 :(得分:1)
您的班级有转换构造函数
Cent(int n);
允许将int
类型的对象隐式转换为Cent
类型的临时对象
如果您要将构造函数声明为
explicit Cent(int n);
然后不会编译运算符调用的代码。
或者,如果您按以下方式声明操作符,则删除第一个参数的限定符const
friend Cent operator+( Cent &c1, const Cent &c2);
然后再次编译代码。