关于拷贝构造函数
O湛狼O 2010-05-25 01:38:48 请问各位,下面这篇文章有那里是错的吗?麻烦指正一下。
相信许多人对拷贝构造函数都有两个疑问:
1、为什么拷贝构造函数(或者系统默认的拷贝构造函数)必须用引用来进行参数传递?
2、可不可以用指针来代替拷贝构造函数?
实际上拷贝构造函数也是构造函数的一个重载,所以自己定义了拷贝构造之后,默认的构造函数就没有了,因为其实已经重定义了构造函数,而形参设置为类的引用,这是拷贝构造的特点,如果不这样设置形参,那么这个就不能叫拷贝构造函数了,那为什么要用引用来进行按地址传递参数呢?我们先假设不用按地址的情况,即假设test(test x);这个是拷贝构造函数,然后,我们生成test 类的对象b和a,用a来初始化b,这时候,编译器就会去寻找有没有以test类对象为形参的函数,然后调用这个函数来进行初始化,幸运的是,它找到了,这个函数就是前面我们假设的test(test x),因为这时候是按值传递,那么这时候这个拷贝构造函数就会生成一个临时的test类对象来接受实参的值,那么这种情况就是用实参去初始化构造函数生成的临时对象,这时候怎么初始化呢?当然又要调用这个拷贝构造函数去初始化形参啦,然后再用实参去初始化拷贝构造函数生成的临时对象,然后怎么初始化呢?当然又得调用拷贝构造函数啦。。。。。这样就会无穷无尽的嵌套调用下去,直到堆栈空间耗尽,所以编译器会禁止这种情况。
那么怎么解决这个问题呢?就是把拷贝构造函数的形参设置为类的引用啦。。。这样就是地址传递,那么久不会出现上面的重复调用拷贝构造函数的情况啦。。。
拷贝构造函数的形参问题,上面已经说过,按值传递是不行的,需要按地址传递,那么引用和指针都是按地址传递,他们的效果是一样的,即是说用指针同样是可以完成功能的,那为什么不用指针呢?同样用上面那个例子来说明吧,我们假设一个以指针作为形参的拷贝构造函数test(test * x);然后生成test类的对象 a,现在我们再生成一个对象b,同时用a给b初始化,那么这时候就会调用拷贝构造函数,即test(test * x),但是拷贝构造函数的形参不能接受一个非地址值,那么我们要怎么给b初始化呢?那就要取地址啦,所以初始化方式是这样的test b(&a);这样虽然效果是一样的,但是使用起来就不如引用方便,引用可以直接用test b(a),这种方式,使得代码更加直观和方便,只是个人意见。如有错误,请指出。