c++ 赋值运算符重载和拷贝构造函数区别以及不写时可能引发的问题

本文探讨了C++中赋值运算符重载与拷贝构造函数的区别,指出在涉及指针成员时未自定义拷贝构造函数和赋值运算符可能导致的问题,例如野指针导致的程序崩溃。建议在成员变量包含指针时实现深拷贝。此外,文章提到了STL容器在交互过程中如何调用这些函数,以及C++11中引入的move语义以优化性能。
摘要由CSDN通过智能技术生成
一、赋值运算符重载和拷贝构造函数区别
#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值