日志
copy and swap
2012-06-05 14:50
重载"="运算符,实现异常安全的
#ifndef WIDGET_H#define WIDGET_H#include <iostream>using namespace std;class Widget{public: Widget(int* elem); ~Widget(){delete _elem;cout<<"~~~"<<endl;} Widget(const Widget& co); Widget& operator=(const Widget& co); void swap(Widget& co); void show() const{cout<<*_elem<<endl;}private: int* _elem;}; #endif // WIDGET_H#include "widget.h" Widget::Widget(int *elem):_elem(elem){ }Widget::Widget(const Widget &co){ _elem = new int(*co._elem);}Widget& Widget::operator=(const Widget&co){ Widget temp(co); swap(temp); return *this;}void Widget::swap(Widget &co){ int *temp = _elem; _elem = co._elem; co._elem = temp;//交换了地址,原先的地址会在局部变量的析构中释放}#include <iostream>using namespace std;#include "widget.h" int main(){ Widget w1(new int(2)); cout<<"show w1_elem:"; w1.show(); Widget w2(new int(4)); cout<<"show w2_elem:"; w2.show(); cout<<"w1 = w2"; w1 = w2;//赋值的过程中使用了一个局部变量,所以在运行时有三次“~~”输出,不要奇怪 cout<<"show w1_elem:"; w1.show(); } |
下一篇: QT 一些非常常用的操作
上一篇: 修饰器