读书人

关于拷贝构造函数的有关问题

发布时间: 2013-06-25 23:45:41 作者: rapoo

关于拷贝构造函数的问题?
本帖最后由 VisualEleven 于 2013-06-20 11:35:47 编辑 创建了一个类,实现了拷贝构造函数,重载了赋值符号=

Complex::Complex()
{
x = 0;
y = 0;
m_szpMyName = (char *)malloc(MAXNAMELEN);
memset(m_szpMyName, '\0', MAXNAMELEN);
}

Complex::Complex(Complex &cpl)
{
x = cpl.x;
y = cpl.y;
m_szpMyName = (char *)malloc(MAXNAMELEN);
memset(m_szpMyName, '\0', MAXNAMELEN);
memcpy(m_szpMyName, cpl.m_szpMyName, MAXNAMELEN);
}

Complex::~Complex()
{
free(m_szpMyName);
m_szpMyName = NULL;
}

Complex Complex::operator +(Complex &c2)
{
Complex c;
c.x = x + c2.x;
c.y += y + c2.y;
return c;
}

Complex Complex::operator = (Complex &cp1)
{
Complex c;
c.m_szpMyName = (char *)malloc(MAXNAMELEN);
c.x = cp1.x;
c.y = cp1.y;
return c;
}

于是有了一个疑问
Complex comp1;
Complex comp2 = comp1; //在这里为什么只调用了拷贝构造函数,没有调用赋值符号的重载?

Complex comp2;
comp2 = comp1; //这里为什么又先调用了重载 =(然后因为重载里有return而调用了拷贝构造函数可以理解的)
[解决办法]
http://blog.csdn.net/lwbeyond/article/details/6202256
[解决办法]
拷贝构造函数和operator=的不同就是拷贝构造函数用在一个是之前没有该对象从而创建该对象,
另外一个是之前已存在该对象,为对象赋值。
[解决办法]
有新对象生成就会调用构造函数,如果是用一个对象初始化另一个就调用拷贝构造(构造函数的一种),如果没有对象生成就是operator=
[解决办法]
Complex comp2 这个对象之前不存在,现在要生成,肯定要个构造函数,默认构造函数和其余构造函数就不行了,这时就要一个复制构造函数。
operator= 两个对象都已经存在了,就不用构造了。

读书人网 >VC/MFC

热点推荐