| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1523 人关注过本帖
标题:关于构造函数和拷贝构造函数
只看楼主 加入收藏
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
收藏
得分:0 
所谓构造函数,顾名思义,就是构造一个对象(当然这要根据构造函数的具体内容包括参数来构造),在上面的代码中,A Obj1;  //没有明确指明构造函数,便调用默认构造
//han数,一种情况是无参的构造函数,另种情况便是参数都有缺省值的构造函数下面的也类似,参数匹配问题
    A Obj2(2,3);  //invoke A(int,int),

而拷贝构造函数,是为了根据一个已经存在的对象来构造另一个对象,而赋值号=也有类似的功能。但被调用的情况不一样。通常情况下,在我们不明写拷贝构造函数和不重载=时候,使用时候都会调用默认的。但是,这种情况下,无论是拷贝构造还是=都是按成员赋值。这样,若成员变量中有指针,拷贝构造后两个对象便会操作同块内存,往往出错。所以我们通常会重写拷贝构造函数和重载=.为指针变量开辟新的空间。
例如
class A
{
public:
 char* p;
}

如果我们不重写拷贝构造函数,这样用
A a;
A b(a);//这里会调用默认的拷贝构造函数,按成员赋值,会有b.p = a.p;这样a和b会共用p指向的地址。
所以我们重写拷贝构造
A(A&ra)
{
  p = new char;//在析构函数中delete
  strcpy(ra.p,p);
}
=和拷贝构造的结果应该是一样的,可被调用的情况不同
如 A A1;//调用默认构造,上面说过
   A A2(A1);//调用拷贝构造
   A A3 = A1;//调用重载的=
   A A4;//调用默认构造
   A4(A1);//注意,这里会调用=而不是拷贝构造函数。

要么死去,要么奋斗!
2008-10-09 09:10
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
A A3 = A1; 调用的好象也是拷贝构造函数吧?
A3 = A1; 这个好象 才调用复制操作吧?
2008-10-09 19:58
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
[bo][un]很远的那颗星[/un] 在 2008-10-8 14:58 的发言:[/bo]



谁说构造函数没有参数?

这个问题随便BAIDU一下都一大堆,楼主不妨试一下...


谁说没有 默认拷贝构造函数?
争论这么半天还隐藏这么大问题

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2008-10-10 09:04
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
收藏
得分:0 
[bo][un]newyj[/un] 在 2008-10-9 19:58 的发言:[/bo]

A A3 = A1; 调用的好象也是拷贝构造函数吧?
A3 = A1; 这个好象 才调用复制操作吧?

是哦

要么死去,要么奋斗!
2008-10-10 14:52
快速回复:关于构造函数和拷贝构造函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.062598 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved