免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1842 | 回复: 7
打印 上一主题 下一主题

[函数] 关于拷贝构造函数的调用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-12 20:14 |只看该作者 |倒序浏览
关于拷贝构造函数的调用问题

论坛徽章:
0
2 [报告]
发表于 2005-09-13 17:52 |只看该作者

关于拷贝构造函数的调用问题

class a,b;
a(b);

论坛徽章:
0
3 [报告]
发表于 2005-09-13 21:44 |只看该作者

关于拷贝构造函数的调用问题

两种情况
1)你没定义自己的拷贝构造函数,系统缺省行为我想是采用的内存直接拷贝,当然如果你的对象里包含指针的话就应该是第二种
2)定义自己的拷贝构造函数,当然只有你自己才知道如何由现有的对象创建新对象,比如,类中定义了一个字符串指针,你就得考虑是不是开辟一块新的存储区,还是两个对象共享这个字符串(很危险的奥)!

论坛徽章:
0
4 [报告]
发表于 2005-09-14 08:50 |只看该作者

关于拷贝构造函数的调用问题

有三种情况下需要调用copy constructor:

(1) 以一个 Object 为另一个 Object  进行初始化。
     例:   X xx;
                  X yy = xx;            // copy constructor

(2) 给函数传递参数。
     例:  void foo(X xx) {}    // 函数定义
                 
               .....
                X x;
                foo(x);                   // 调用函数,传递参数。

(3) 函数返回值。
    例:
      X foo() {
             X temp;
             .....
             return temp;          // copy constructor
         }

论坛徽章:
0
5 [报告]
发表于 2005-09-14 09:10 |只看该作者

关于拷贝构造函数的调用问题

To mik:
  第一种调用的应该不是copy constructor,而是赋值函数。是不一样的。

论坛徽章:
0
6 [报告]
发表于 2005-09-14 09:18 |只看该作者

关于拷贝构造函数的调用问题

原帖由 "wxp19831104" 发表:
To mik:
  第一种调用的应该不是copy constructor,而是赋值函数。是不一样的。



那是初始化动作。。。 你要搞清楚,什么是初始化。

假如:
         X x;
             X y;
             x = y;             // 这里,才是调用赋值函数!!!!!(前提:是你定义了一个赋值函数。


      X xx = x;             // 这里,是 copy constructor !!!!(前提:定义了一个copy constructor


以上两种情况,如果未定义 copy constructor 或是 赋值函数,将产生 memberwise copy (位逐次复制)也就是直接复制。。。

论坛徽章:
0
7 [报告]
发表于 2005-09-14 09:22 |只看该作者

关于拷贝构造函数的调用问题

To wxp:
  理解错误,不要随便误导别人.如果不能确定,最好写个测试程序看一下,不要张口就来.
第一种情况,调用拷贝构造函数.
   X xx;
  X yy = xx;            // copy constructor

第二种情况,调用赋值运算符重载
比如
  XX xx;
  X yy;
  yy = xx; //赋值运算符重载


XX xx, yy;
  yy = xx; //赋值运算符重载

记住,构造是一个从无到有的过程,赋值是对一个已存在的对象进行修改.即构造函数调用前,对象是不存在的,调用成功后,对象方能存在.

赋值运算符重载的前提是对象已经存在了,并且调用重载函数对其数据成员进行修改-------比如释放掉以前调用构造函数分配的存储空间并重新进行分配初始化等操作.

论坛徽章:
0
8 [报告]
发表于 2005-09-14 13:34 |只看该作者

关于拷贝构造函数的调用问题

拷贝构造函数和赋值运算是不一样的,典型的情况是
对一个已经存在的对象进行赋值时左值已经存在,所以在进行赋值的时侯除了跟拷贝构造函数完成一样的操作外,还要考虑释放原对象所分配的空间.
所以拷贝构造函数就不应该同赋值运算符具有同样的逻辑
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP