赋值构造函数(重载赋值操作符)(c++常问问题二)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了赋值构造函数(重载赋值操作符)(c++常问问题二)相关的知识,希望对你有一定的参考价值。

*什么是赋值构造函数(重载赋值操作符)

下面的代码演示了什么是赋值构造函数,如果不人为定义赋值构造函数,系统将默认给你分配一个浅拷贝的赋值构造函数(下面例子为深拷贝的赋值操作)

 

class cat
{
public:
	//构造函数
	cat():m_pMyName(NULL),m_unAge(0)
	{
		cout<<"cat defult ctor"<<endl;
	}

	//子类赋值构造函数(重载赋值操作符)
	cat& operator=(cat& other)
	{
		this->m_unAge = other.m_unAge;

		//把自己的空间释放先
		if (0 != this->m_pMyName)
		{
			delete this->m_pMyName;
			this->m_pMyName = NULL;
		}

		//如果目标有名字
		if (other.m_pMyName)
		{
			//动态分配一个名字长度+1的堆..此处为深拷贝
			int len = strlen(other.m_pMyName);
			m_pMyName = new char[len + 1];
			memset(m_pMyName , 0 , len+1);
			memcpy(m_pMyName , other.m_pMyName , len+1);
		}

		/*
		//如果目标有名字
		if (other.m_pMyName)
		{
			//动态分配一个名字长度+1的堆..此处为浅拷贝..只复制了指针,没复制指针指向的对象
			m_pMyName = other.m_pMyName;
		}
		*/
		return *this;
	}

	unsigned int m_unAge;
	char* m_pMyName;
};

//实战演练
void main()
{
    cat A;
    cat B = A; //复制拷贝函数
    cat C(A);//复制拷贝函数
    cat D;
    D = A;//赋值构造
}

 

结论:通常定义了拷贝构造函数,赋值操作符也要同时重载...而当需要手动写这两个函数时,析构函数大部分情况下也是必要的

以上是关于赋值构造函数(重载赋值操作符)(c++常问问题二)的主要内容,如果未能解决你的问题,请参考以下文章

移动构造函数(c++常问问题十六)

c++中拷贝构造函数和赋值运算符重载本质上一样么

C++初阶第五篇——类和对象(中)(构造函数+析构函数+拷贝构造函数+赋值操作符重载)

C++类的默认函数

C++中赋值运算操作符和=重载有啥区别?

C++进一步认识类与对象