C++问题:T t和T& t有什么本质区别?为什么T t会使值发生变化?

#include <iostream>
using namespace std;
class T
{
public:
T(){
cout<<"T::T()"<<endl;
}

T(T& a){
cout<<"T::T(T&)"<<endl;
}

~T(){
cout<<"T::~T()"<<endl;
}

int i;
};

void func(T t)
{
cout<<"func() "<<t.i <<endl;
}

void func2(T& t)
{
cout<<"func() "<<t.i <<endl;
}

void main()
{
T tt;
func(tt);
func2(tt);
}

T t和T& t的本质区别:
如果函数的形参类型为T&,则调用该函数时,对应的实参应为左值(可以为其赋值的变量或表达式),这时,形参是实参的别名,函数体中对形参的操作就是对实参的操作,因此T&类型形参可以实现实参与形参的双向传递。

如果函数的形参类型为T,则调用该函数时,对应的实参可以是任意表达式,这时,在函数被调用时,系统为形参分配存储单元,并将实参的值复制到形参(形参和实参各自拥有自己的存储单元)。于是函数体中对形参的操作已经于实参无关了,因此T类型形参只能实现实参到形参的单向传递。

那么,本例的func函数形参类型为T,按理输出的结果应该和主函数中的tt对象的i成员值相同啊,为什么会不同呢?
原因是T是类,调用函数时,系统为形参t分配了内存单元,然后把“实参tt传递给形参t的任务”交给类T的拷贝构造函数来完成,但本例中拷贝构造函数没有进行数据的复制操作,因此形参t的数据成员i的值就不确定了(实际是其所分配到的单元的原有值)。
“T t使值发生变化” 这可以说是拷贝构造函数的“失职”,本例,拷贝构造函数应该是:
T(T& a){
cout<<"T::T(T&)"<<endl; //此语句可有可无
i=a.i; // 此语句不可少,否则就完不成拷贝构造函数应该完成的任务了。
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-20
&t只是引用而已,经函数运算后值不变。而t直接参与运算,运算后结果可能与之前的t不一样(变不变具体看函数)。
第2个回答  2011-11-20
对象和基本数据类型不一样,调用都是读取其头指针。
第一个t储存的是对象地址,第二个t存的是对象地址的地址;
第3个回答  2011-11-20
& 在C++中是引用的意思,也就是原来对象的别名,使用或改变变量也会改变原变量
这就很好解释你上面的问题了!
func 把tt传过去,这个时候在函数中又产生了一个副本 t 打印的时候打印的是副本的i 又因为你对象中i都没有进行初始化。那么你构建对象的时候 只是为i分内存空间并没有初始化
func2 也是一样 但是唯一的是没有产生副本!