参考资料:《C++Primer习题集(第5版)》
目的:练习实现类指针行为。
/*
* HasPtr1.cpp
*
*
*/
#include <iostream>
#include <string>
#include <algorithm>
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!
*/