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和返回类型仅供参考...那么为什么堆栈溢出
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获得了正确的输出。
int operator+(int i1,number n2)
{
return (i1*10 + n2);
}
int main()
{
int a,b=7;
number n1 = num;
a=b + n1;
}
场景3也导致堆栈溢出 是否有int对象的复制构造函数??
答案 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;
如果你实现了一个全局减法运算符,你会回到原点!