一个容易的c++程序,求解惑

一个简单的c++程序,求解惑!
#include <iostream>
using namespace std;
/*********************************************
* operator 
* 功能: 重载为类的非成员函数
*********************************************/

class Complex
{
public:
Complex(int xx,int yy):x(xx),y(yy){}
//运算符重载
friend Complex &operator +(const Complex &c1,const Complex &c2);
void show()
{
cout<<"I="<<this->x<<","<<"R="<<this->y<<endl;
}

private:
int x;
int y;
};
Complex &operator +(const Complex &c1,const Complex &c2)
{
return Complex(c1.x+c2.x,c1.y+c2.y);
}
int main()
{
Complex c1(2,0);
Complex c2(2,0);
(c1+c2).show();

return 0;
}
疑问:为什么输出不是I=4,R=0 ?而是两个随机值I=30290716,R=2147323904,见下图
一个容易的c++程序,求解惑

////////////////////////////////////////////////////////
如果说是返回了临时变量那下面这段C语言测试代码为什么不出现随机值?而是正常显示为15。不知道怎么学着学着突然出现这样的疑问,太可怕了
#include <stdio.h>
/********************************************
* fun()
* 功能:测试局部变量的返回值是否被销毁
********************************************/
int fun()
{
int a=5;
return a;
}
int main()
{

printf("%d\n",fun()+10);
return 0;
}
c++ c

------解决方案--------------------
不能返回一个局部对象的引用  函数退出对象都销毁了  引用哪啊
------解决方案--------------------
第一个
Complex &operator +(const Complex &c1,const Complex &c2)
 {
 return Complex(c1.x+c2.x,c1.y+c2.y);
 }
返回的是局部对象的引用,返回后就销毁了。

第二个
返回的是int的值,所以正确。

在部分编译器中,简单类型返回局部对象的引用都可能对的。
------解决方案--------------------
引用:
引用:不能返回一个局部对象的引用  函数退出对象都销毁了  引用哪啊那下面的C代码页返回的是局部对象为什么能正常输出?

下面的是传值操作,会把a的值赋给一个编译器生成的临时变量。