C++函数返回引用和值问题

今天因为改到一个代码,所以遇到一个问题。函数里局部变量返回的问题。
以下是代码,就是运用类模板,重载了+操作:
一。最原始的代码如下:
#include
#include
template
class T_Counter
{
public:
T_Counter(T aa)
{
	a=aa;
}
T_Counter()
{
	a=0;
}
~T_Counter()
{
	cout<<"T_Counter "<

T_Counter& operator +(const T_Counter t)
{

	T_Counter temp;
	temp.a=a+t.a;
	return temp;
}

friend ostream& operator<<(ostream &output,T_Counter& t)
{

	output<>(istream &input,T_Counter &t)
{
	input>>t.a;
	return input;
}

private:
	T a;
};


int main()
{
	T_Counter a(100),b(20);
	c = a+b;
	cout<

在win7+VS2012下可以编译通过,结果如下:
 
  
T_Counter 120 destruct!
T_Counter 20 destruct!
 
  
 
  
120
T_Counter 120 destruct!
T_Counter 20 destruct!
T_Counter 100 destruct!

我的理解是:首先输入参数是传值,那么首先会创建一个局部变量来接收传入的值,也就是t。接下来就是构造temp。所以前两行就是因为在
T_Counter& operator +(const T_Counter t)返回前销毁了两个临时变量,调用了相应的析构函数。但是这里的返回引用就有问题,因为
返回引用其实也就是返回临时变量temp的地址,但是因为temp地址所指向的东西在return前已经被销毁了。这样肯定会出错,但却运行正常。
但是这段代码在ubuntu kylin下编译不过,就因为返回引用。

二。接下来,我把T_Counter& operator +(const T_Counter& t)改成如下:
T_Counter operator +(const T_Counter& t)
 
  
{

	T_Counter temp;
	temp.a=a+t.a;
	return temp;
}
在两个系统下皆通过。
 
  
 
  
运行结果如下:


我的理解:除了返回类型改成返回值,还有输入参数改为引用。查阅了一些资料,因为其实指针或地址都是在函数的栈上的,所以当函数返回时会销毁栈的东西,而值则是在堆上的,所以返回之后并没有问题。而输出结果少了第二行T_Counter 20 destruct!是因为输入参数传入了引用t,所以并没有构造临时变量,也就没有析构。

三。接下来,我把main函数里的c去掉。代码改成如下:
        T_Counter a(100),b(20);
        cout<

问题:ubuntu下提示没有从T_Count到T_Count&的转换。看了一下,是重载+操作符函数的问题,因为
friend ostream& operator<<(ostream &output,T_Counter& t)接收的是一个T_Count&,而我们传入的是一个值。所以就出错了。
改成如下就没错,friend ostream& operator<<(ostream &output,T_Counter t)。但输出结果有点奇葩。
输出结果为:
 
  

这里我就不理解啦。现在到VS下看看

你可能感兴趣的:(c++)