赋值运算符重载返回值和参数类型问题
问题描述:对于自定义类型来说,赋值运算符重载时函数返回值和参数类型为什么一定要是引用类型呢?注释部分是我自己的理解,请各位大神帮忙看看有什么错误帮忙指正一下,先谢谢各位了。程序代码:
#include<iostream> using namespace std; //赋值运算符重载 class Person { public: Person(int age) { m_Age = new int(age); } //参数必须是引用类型,若是值类型,在函数结束时会执行析构函数把指针(传入的对象的m_Age这个指针成员)指向的内存空间释放掉. Person& operator=(Person &p) //返回值必须是引用的个人理解在下方 test01 函数中 { //如果有未释放的堆区空间,先释放 if (m_Age != NULL) { delete m_Age; m_Age = NULL; } m_Age = new int(*p.m_Age); return *this; } ~Person() { if (m_Age != NULL) { delete m_Age; m_Age = NULL; } } int *m_Age; }; void test01() { Person p1(18); Person p2(20); Person p3(30); p3 = p2 = p1; //对于自定义数据类型,等号运算符重载返回值必须是引用类型 //如上方代码相当于p3.operator=(p2.operator=(p1));,其中参数传递过程,即 Person &p = p2.operator=(p1);,如果operator= 函数返回的是值 //则会先在内存中创建一个临时对象temp用于接收传递来的对象副本,然后用这个临时对象为引用p初始化 //而临时对象声明周期很短,仅在当前语句结束后就释放其内存空间,而后再通过p访问临时变量的内存空间则是非法操作。 cout << "p1的年龄为:" << *p1.m_Age << endl; cout << "p2的年龄为:" << *p2.m_Age << endl; cout << "p3的年龄为:" << *p3.m_Age << endl; } int main(void) { test01(); system("pause"); return 0; }
[此贴子已经被作者于2021-2-24 14:57编辑过]