13.2控制拷贝和资源管理
1.如果类的每个对象相互独立,不共享除静态成员以外的元素,那么称之为类值的;如果如果类的每个对象不是相互独立,共享了除静态成员以外的元素,那么称之为类指针的。
2.大多数赋值运算符组合了析构函数函数拷贝构造函数的工作,赋值运算符还必须考虑自赋值的正确性。
3.类指针的类最好是用shared_ptr来管理类中的资源,否则需要自行定义一个引用计数,将计数器保存在动态内存中
下面是一个类指针的程序例子:
#include <iostream> #include <string> using namespace std; class hasptr { friend void swap(hasptr&, hasptr&); public: hasptr(const string &s = string()) : ps(new string(s)), i(0), use(new size_t(1)) { } hasptr(const hasptr &p) : ps(p.ps), i(p.i), use(p.use) { ++*use; } hasptr& operator = (const hasptr&); hasptr& operator = (const string &); string& operator*(); ~hasptr(); private: string *ps; int i; size_t *use; }; hasptr::~hasptr() { if (--*use == 0) //每销毁一个对象,就将其use指针指向的内存内容减一 { delete ps; delete use; } } hasptr& hasptr::operator = (const hasptr &rhs) { ++*rhs.use; if (--*use == 0) { delete ps; delete use; } ps = rhs.ps; i = rhs.i; use = rhs.use; return *this; } hasptr& hasptr::operator = (const string & rhs) { *ps = rhs; return *this; } string & hasptr::operator *() { return *ps; } inline void swap(hasptr& lhs, hasptr& rhs) { using std::swap; swap(lhs.ps, rhs.ps); swap(lhs.i, rhs.i); } int main(int argc, char*argv[]) { hasptr h("hi mom"); hasptr h2 = h; h = "hi dad"; cout << "h: " << *h << endl; cout << "h2: " << *h2 << endl; return 0; }