当前位置:编程学习 > C#/ASP.NET >>

为什么拷贝构造函数的形参必须是引用类型?

我现在用的c++,用到了拷贝构造函数,为什么拷贝构造函数的形参必须是引用类型?请各位指点! --------------------编程问答-------------------- 转贴:

复制构造函数只有一个参数,由于在创建时传入的是同种类型的对象,所以一个很自然的想法是将该类型的对象作为参数,像这样:
    Sample (Sample a);
    不幸的是,即使是这样朴实无华的声明也隐含了一个微妙的错误,呵,我们来看看:当某个时候需要以一个Sample对象的值来为一个新对象进行初始化时,编译器会在各个重载的构造函数版本(如果有多个的话)搜寻,它找到的这个版本,发现声明参数与传入的对象一致,因此该构造函数将会被调用。目前为止,一切都在我们的意料之中,但问题很快来了:该函数的参数我们使用了值传递的方式,按照前面的分析,这需要调用复制构造函数,于是编译器又再度搜寻,最后当然又找到了它,于是进行调用,但同样地,传参时又要进行复制,于是再调用...这个过程周而复始,每次都是到了函数入口处就进行递归,直到堆栈空间耗尽,程序崩溃...

由是观之,值传递看来是行不通的了;我想C语言的用户这时很快会反应到与值传递对应的方式:地址传递(传址),于是声明变为这样:
    Sample Sample *p);
    只作为一般的构造函数,它应该可以运行得很好,但别忘了我们要提供的是复制构造函数,它要求能够接受一个同类型对象,像这样:
    Sample a;
    Sample b(a);
    而不是接受指针:
    Sample a;
    Sample b(&a);  // 还要取地址?当然,它可以正确运行,但...
    虽然在初始化对象时可以像上面一样人为加一个取址符,但在函数参数表中(或者函数返回)进行值传递时,编译器可不知道在找不着合适定义的情况下牵就选择你的指针版本。
--------------------编程问答-------------------- 拜读! --------------------编程问答--------------------
引用 1 楼 amandag 的回复:
转贴:

复制构造函数只有一个参数,由于在创建时传入的是同种类型的对象,所以一个很自然的想法是将该类型的对象作为参数,像这样:
           Sample   (Sample   a);
           不幸的是,即使是这样朴实无华的声明也隐含了一个微妙的错误,呵,我们来看看:当某个时候需要以一个Sample对象的值来为一个新对象进行初始化时,编译器会在各个重载的构造函数版……


拜读
--------------------编程问答-------------------- C++的OO中好象有这个概念:拷贝构造函数
具体时间长都忘了. --------------------编程问答-------------------- 。。。 。。。引用说明不是副本。。。 --------------------编程问答-------------------- 如果不是引用类型,那么就是按值传递了, 按值传递就会产生副本,就会调用拷贝构造函数,这样就造成拷贝构造函数的递归调用了。 --------------------编程问答-------------------- Sample (Sample a);
--------------------编程问答-------------------- 拷贝构造函数会被自动调用的说~ --------------------编程问答-------------------- 初学C++,书上关于此段的描述也是读了多遍才略有所悟,感觉上属于比较微妙的技术~ --------------------编程问答-------------------- 呵呵,我前面也有这个疑问,在网上找到了相应的文章才知道原因,感觉自己还差的远啊 --------------------编程问答-------------------- 高歌说的很明白
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,