深入探索类与动态内存管理
1. 重载赋值运算符
当类的数据成员指向堆上的内存时,我们需要考虑编写一个复制构造函数,为新对象分配内存并进行深拷贝。同时,也要考虑重载赋值运算符。
在赋值语句中,如果两边都是同一类的对象,就会调用该类的赋值运算符成员函数。如果我们没有自己编写赋值运算符成员函数,编译器会提供一个默认的。默认的赋值运算符和默认的复制构造函数一样,只进行成员逐个复制。
对于简单的类,默认赋值运算符通常是可以的。但当类有指向堆上值的数据成员时,就应该自己编写重载赋值运算符,否则在对象赋值时会产生浅拷贝。
以下是一个 Critter
类的重载赋值运算符的示例:
// 类定义内的声明
Critter& Critter::operator=(const Critter& c);
// 类定义外的成员函数定义
Critter& Critter::operator=(const Critter& c)
{
cout << "Overloaded Assignment Operator called\n";
if (this != &c)
{
delete m_pName;
m_pName = new string(*(c.m_pName));
m_Age = c.m_Age;
}
return *this;
}
重载赋值运算符成员函数应返回一个对 Critter