C++

赋值运算符函数

Posted by Sutdown on November 3, 2024

赋值运算符函数

1
2
3
4
5
6
7
8
9
10
11
class CMyString {
	public:
		CMyString(char* pData = NULL);
		CMyString(const CMyString& str);
		~CMyString(void);

		CMyString& operator =(const CMyString &str);

	private:
		char* m_pData;
};

赋值运算符函数的目的在于将另一个对象拷贝到当前对象中,值得注意的点包括

  • 深拷贝和浅拷贝
  • 内存分配

基于深拷贝和浅拷贝:

如果只是简单的将拷贝对象的值赋值到被拷贝对象中,那么两个对象的指针指向同一块内存,内存释放时容易发生多次释放而导致出问题,对此选择的方式是深拷贝,也就是将当前对象原来的值释放,重新分配一块新的内存。

同时需要注意,如果两个实例是同一个的话,直接返回实例就好,否则释放之后再进行拷贝会因为找不到实例的值而出错。

1
2
3
4
5
6
7
8
9
10
11
12
// 深拷贝
CMyString& CMyString::operator =(const CMyString &str) {
	if (this == &str)
		return *this;
	delete []m_pData; // 释放当前内存时注意判断两个实例是不是同一个
	m_pData = NULL;

	m_pData = new char[strlen(str.m_pData) + 1];
	strcpy(m_pData, str.m_pData);

	return *this;
}

关于内存分配:

上面函数欠缺部分在于异常处理,如果new失败会造成不好的后果,因此可以考虑另一种方案,创建一个临时实例,和当前变量交换即可。临时实例创建在栈中,局部函数结束时会自动释放。

1
2
3
4
5
6
7
if (*this != &str) {
		CMyString strTemp(str);
		char *pTemp = strTemp.m_pData;
		strTemp.m_pData = m_pData;
		m_pData = pTemp;
	}
	return *this;