重新讨论返回局部对象的引用有关问题

重新讨论返回局部对象的引用问题。之前开了一贴,但是似乎我的表述不到位,现在重新开一贴描述:首先,我明白,

重新讨论返回局部对象的引用问题。
之前开了一贴,但是似乎我的表述不到位,现在重新开一贴描述:
首先,我明白,程序是不能返回局部变量的引用的,因为局部变量会被释放,从而使得对应的引用变为垃圾数字,比如下面这个例子:
class Test
{
public:
Test(int numerator, int denominator):n(numerator), d(denominator){cout<<"构造函数"<<endl;}
double getValue(){ double result = (double)n/(double)d;return result;}
~Test(){cout<<"析构函数"<<endl;}
Test &operator=(const Test& rhs)
{
n = rhs.n;
d = rhs.d;
return *this;
}
Test(const Test& rhs):n(rhs.n),d(rhs.d){}
private:
int n;
int d;
friend const Test& operator*(const Test &lhs, const Test &rhs);
};

const Test& operator*(const Test &lhs, const Test &rhs)
{
Test result(lhs.n * rhs.n, lhs.d * rhs.d);
return result;
}
那么我在main函数:
Test a(1,2);
Test b(1,5);
Test c ( a * b);
cout<<c.getValue()<<endl;
return 0;
的确会得到不合理的结果。
可是我的问题是,假如我把自己编写的复制构造函数Test(const Test& rhs):n(rhs.n),d(rhs.d){}去掉,那么这个看似不合理的operator*又能得出正确的结果了。

我想知道这是为什么?为什么去掉复制构造函数以后又能莫名其妙的得出正确的结果。希望高手能给我一个比较“对题”的解释。


[解决办法]

探讨非常感谢你的回复,根据你的提示我已经基本想明白了:那个关于类的例子是因为调用了复制构造函数,所以如果把这个构造函数注释掉,就不会发生栈改动了,所以就会对了。但是对于你举的第一个例子,我还是有一点小疑问:如果把int &k = func();改成int k = func();就又对了,是不是因为这里也算是“内置类型”的构造函数呢?