拷贝构造函数与“=”赋值号的区别是什么?

babyding 2005-04-26 02:12:55
在c++中,用对象去初始化对象时。系统自动调用拷贝构造函数,来初始化。
但是这个与赋值号“=”的区别,是什么?赋值号也可以进行初始化对象的.
...全文
442 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjp6688 2005-04-28
  • 打赏
  • 举报
回复
注意深拷贝和浅拷贝的问题,否则内存容易出现问题
zdy_8212 2005-04-28
  • 打赏
  • 举报
回复
挺像值传递和指针传递
lw1a2 2005-04-27
  • 打赏
  • 举报
回复
运行一下这个程序吧:

#include <iostream>
using namespace std;

class A
{
public:
A(){i=0;cout<<"Default Constructor"<<endl;}
A(const A& rhs)
{
i=rhs.i;
cout<<"Copy Constructor"<<endl;
}
A& operator=(const A& rhs)
{
if(this!=&rhs)
i=rhs.i;
cout<<"="<<endl;
return *this;
}
int i;
};

int main()
{
A a;
a.i=1;
A b=a;
cout<<b.i<<endl;
system("pause");
}
seaman117 2005-04-27
  • 打赏
  • 举报
回复
一句话拷贝构造函数是给即将创建的对象拷贝,赋值是给已经存在的对象赋值!
withc 2005-04-27
  • 打赏
  • 举报
回复
就是实现的内部代码不一样。
如果你写成了一样的,那就一样了。
qhfu 2005-04-26
  • 打赏
  • 举报
回复
operator=();
和拷贝构造函数的实现就不一样,
拷贝构造函数首先是一个构造函数,它调用的时候产生一个对象,是通过参数传进来的那个对象来初始化,产生的对象。
operator=();是把一个对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是的话就不做任何操作。
qhfu 2005-04-26
  • 打赏
  • 举报
回复
应该不是,,而是调用默认的 operator=();
haiyan2004 2005-04-26
  • 打赏
  • 举报
回复
直接用=是不是要调用默认拷贝构造函数?
各位大虾请指教
haiyan2004 2005-04-26
  • 打赏
  • 举报
回复
那个默认拷贝构造函数是干什么用的
gogdo 2005-04-26
  • 打赏
  • 举报
回复
你只要记住拷贝构造函数是用于类中指针,对象间的COPY
以后多用你就会慢慢明白。
寻开心 2005-04-26
  • 打赏
  • 举报
回复
单纯从拷贝还是=上分析它没有太多的意义
因为他们在某些场合下都是可以省略的(内部对象都有复制或者拷贝函数原形的时候)
uoyevoli 2005-04-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/uoyevoli/archive/2005/04/21/357448.aspx
看看这里,对你有没有帮助。
寻开心 2005-04-26
  • 打赏
  • 举报
回复
一般来说是在数据成员包含指针对象的时候,应付两种不同的处理需求的

一种是复制指针对象,一种是引用指针对象
copy大多数情况下是复制,=则是引用对象的

例子:
class A
{
int nLen;
char * pData;
}
显然
A a, b;
a=b的时候,对于pData数据存在两种需求,
第一种copy
a.pData = new char [nLen];
memcpy(a.pData, b.pData, nLen);
另外一种(引用方式):
a.pData = b.pData

通过对比就可以看到,他们是不同的
往往把第一种用copy使用,第二种用=实现
lw1a2 2005-04-26
  • 打赏
  • 举报
回复
我说的不对呀, v41dugu(一步一生)是对的
useresu 2005-04-26
  • 打赏
  • 举报
回复
自引用的说法好象欠妥,是自己给自己赋值.
举个例子了,

CB& CB::operator=(const CB& rhs)
{
// 检查对自己赋值的情况
if (this == &rhs) return *this;

...

}

useresu 2005-04-26
  • 打赏
  • 举报
回复
区别?
好象楼上的都没说到这点:

那就是=实现时需要检查自引用,
而拷贝构造函数不用的.

呵呵,补个漏.混分啊
zhousqy 2005-04-26
  • 打赏
  • 举报
回复
同意樓上的。
dongpy 2005-04-26
  • 打赏
  • 举报
回复
赋值号也可以进行初始化对象的.
==================================
A a1;
A a2 = a1;

//这里虽然是赋值号,只是初始化的另一种形式。

//其实就是A a2(a1);用拷贝构造函数来初始化对象a2。
babyding 2005-04-26
  • 打赏
  • 举报
回复
lw1a2(一刀(P540)) :你说的是不是就是先用构造函数初始化一个对象,再用这个对象是赋值另一个对象,要比直接用拷贝构造函数慢。such as:
class C
.
.
C a(初始化的值),b;
b=a;//这个效率没有C b(a);高。
有没有其他的不同了,他们的作用是一样的啊。

beyondtkl(大龙驹<學,無涯>)
我说的是
class C
.
.
C a(初始化的值),b;
b=a;//用对象去赋值
和C b(a);//用拷贝构造函数去初始化对象。
这两个都可以初始化对象b.但区别何在?


lw1a2 2005-04-26
  • 打赏
  • 举报
回复
我说错了
加载更多回复(7)

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧