+过载不需要两个功能吗?

时间:2014-07-30 18:11:29

标签: c++ operator-overloading

我在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。

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

然后再次编译代码。