C++ 中类的赋值运算符\"=\"重载实践

2 下载量 118 浏览量 更新于2024-08-28 收藏 110KB PDF 举报
"C++类的赋值运算符重载用于处理特定对象的赋值操作,尤其是在涉及动态内存分配时。通常,当类中包含指针或其他需要特别处理的资源时,需要重载赋值运算符。 在C++中,赋值运算符”=”默认提供浅复制,即复制对象的成员值,但不处理动态内存。对于含有动态内存或共享资源的类,浅复制可能导致意料之外的结果,比如两次释放同一块内存或多个对象指向同一块内存,引发错误。因此,为了确保赋值行为正确无误,我们需要重载赋值运算符来实现深复制。 以下是一个包含动态内存的类`person`的示例: ```cpp class person { int* age; public: person(const int& a = 10) : age(new int(a)) {} // 构造函数,动态分配内存 ~person() { delete age; cout << "析构\n"; } // 析构函数,释放内存 void showAdd() { cout << hex << age << endl; } // 打印age指针的地址 void show() { cout << *age << endl; } // 打印age指向的值 void set(const int& a) { *age = a; } // 修改age指向的值 }; ``` 在这个例子中,如果尝试直接赋值,如`person b = a;`,就会产生问题,因为`b`将拥有与`a`相同的`age`指针,而没有复制`age`指向的数据。为了避免这个问题,我们需要重载赋值运算符(又称拷贝赋值运算符): ```cpp person& operator=(const person& other) { if (this != &other) { // 防止自我赋值 delete age; // 释放旧的内存 age = new int(*other.age); // 分配新内存并复制数据 } return *this; } ``` 重载赋值运算符的规则通常包括以下几点: 1. 防止自我赋值:`if (this != &other)`,这样可以避免在`a = a;`这样的情况下出错。 2. 释放旧资源:在分配新资源之前,确保旧资源被正确释放。 3. 深复制:分配新的内存并复制其他对象的数据。 4. 返回引用:返回`*this`,使得连续赋值如`a = b = c;`能够正常工作。 在`f`函数中,如果没有重载赋值运算符,`b=a`会导致两个对象共享同一块内存,当`b`离开作用域时,析构函数会删除这块内存,而`a`仍然保留对它的引用,导致悬挂指针。通过重载赋值运算符,我们可以确保每个对象都有自己的内存空间,从而避免这种问题。 当类的实例管理着动态分配的内存或其他需要特殊处理的资源时,重载赋值运算符是必要的,以确保赋值操作的正确性和对象的正确生命周期管理。正确地重载赋值运算符是C++编程中的一个重要实践,可以避免潜在的内存泄漏和意外的行为。