一、赋值运算符重载和拷贝构造函数区别
#include <iostream>
using namespace std;
class Element
{
private:
int *m_pdata;
public:
Element(int data):m_pdata(NULL) // 指针的成员函数一定在初始化列表中赋值为初始化为NULL
{
cout << "构造函数" << endl;
m_pdata = new int(data);
}
Element(const Element& e)
{
cout << "拷贝构造" << endl;
}
void operator=(const Element& e) // 返回值是void,有啥问题呢?
{
cout << "运算符重载" << endl;
}
~Element()
{
delete m_pdata;
}
};
int main()
{
Element e1(1);
Element e2(2);
Element e3 = e1;
e2 = e1;
system("pause");
return 0;
}
运行上面的程序后,输出如下:
所以最后可以得出结论:
(1)拷贝构造函数是在初始化并赋值的时候调用的。比如说例子中的Element e3 = e1,或者stl容器vector在添加元素的时候都会调用拷贝构造函数。
(2)赋值运算符重载只会在单纯的赋值操作中调用,被赋值的对象已经创建过了。
二、可能引发的问题
如果没写自定义的拷贝构造函数或者赋值运算符重载的话,调用时会默认使用浅拷贝,当成员函数中有指针的话会出大问题
上面的成员变量就是指针,把上面的代码稍微修改一下,去掉自定义的拷贝构造函数或者赋值运算符重载。
#include <iostream>
using namespace std;
class Element