c++拷贝构造函数与拷贝赋值运算符练习3

参考资料:《C++Primer习题集(第5版)》

目的:练习实现类指针行为。

/*
 * HasPtr1.cpp
 *
 *  
 */
#include 
#include 
#include 
using namespace std;

class HasPtr {
private:
    string *ps;
    int i;
    size_t *use;//用来记录有多少个对象共享*ps的成员;
public:
    //构造函数分配新的string和新的计数器, 将计数器置为1;
    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;
    string &operator * ();//解引用;
    ~HasPtr();//析构函数;
};

HasPtr::~HasPtr() {
    if (--*use == 0) {//如果引用计数定为0;//--use表明已有一个共享*ps的成员被释放;
        delete ps;//释放string内存;
        delete use;//释放计数器内存;
    }
}

HasPtr& HasPtr::operator = (const HasPtr &rhs) {
    ++*rhs.use;//递增右侧对象的引用计数;
    if (--*use == 0) {//递减本对象的引用计数;
        delete ps;//如果没有其他用户;
        delete use;//释放本对象分配的成员;
    }
    ps = rhs.ps;//将数据从rhs拷贝到本对象;
    i = rhs.i;
    use = rhs.use;
    return *this;
}

HasPtr& HasPtr::operator = (const string &rhs) {
    *ps = rhs;//拷贝字符串;
    return *this;
}

string& HasPtr::operator * () {
    return *ps;//返回ps指针的解引用;
}

int main(int argc, char **argv) {
    HasPtr h("hi mom!");
    HasPtr h2 = h;//未分配新string, h2和h指向相同的string;
    cout << "h: " << *h << endl;
    cout << "h2: " << *h2 << endl;
    h = "hi dad!";
    cout << "h: " << *h << endl;
    cout << "h2: " << *h2 << endl;
    return 0;
}
/*
h: hi mom!
h2: hi mom!
h: hi dad!
h2: hi dad!
*/

你可能感兴趣的:(c++拷贝构造函数与拷贝赋值运算符练习3)