C ++ ::全局运算符重载问题

时间:2015-03-11 09:24:21

标签: c++ operator-overloading

场景1

enum number{num=3};
int& operator+(const int& i1,number& n2)
{
    return (i1*10 + n2);
}
int main()
{
    int a,b=7;
    number n1 = num;
    a=7+n1;
}

输出是程序崩溃,堆栈溢出......为什么堆栈溢出发生?int& operator +(const int& i1,number& n2)....所有args和返回类型仅供参考...那么为什么堆栈溢出

场景2

enum number{num=3};
int operator+( int& i1,number& n2)
{
    return (i1*10 + n2);
}
int main()
{
    int a,b=7;
    number n1 = num;
    a=b+n1;
}

我用73获得了正确的输出。

场景3

 int operator+(int i1,number n2)
    {
        return (i1*10 + n2);
    }
    int main()
    {
        int a,b=7;
        number n1 = num;
        a=b + n1;
    }

场景3也导致堆栈溢出 是否有int对象的复制构造函数??

2 个答案:

答案 0 :(得分:3)

在场景1中,由于您反复以递归方式调用相同的函数,因此会出现堆栈溢出。

int& operator+(const int& i1,number& n2)
{
    return (i1*10 + n2);
}//         ^^^^^

标记的表达式会创建一个临时int,它可以绑定到const int&,因此会调用operator+(const int&, number&)

方案2有效,因为i1*10 无法绑定到非const int&,因此n2会隐式转换为int并且调用标准int加法运算符。

答案 1 :(得分:1)

场景1返回悬空参考。程序行为未定义。应将堆栈溢出视为此行为的一种表现形式。

场景2格式正确,因为它返回结果的值副本。但是你应该将原型更改为int operator+(const int& i1, const number& n2)甚至int operator+(const int i1, const number n2),然后调整函数体以避免函数调用自身(匿名临时将绑定到常量引用);最简单的方法是将enum投射到int或使用设计

return i1 * 10 - -n2;

如果你实现了一个全局减法运算符,你会回到原点!