unCopyable类
class unCopyable{
protected:
unCopyable(){}
~unCopyable(){}
private:
unCopyable(const unCopyable &);
unCopyable & operator=(const unCopyable&);
}
class home :private unCopyable{}
注意上面的基类的protected类型的构造函数和析构函数,子类是private继承。private继承是实现继承。
赋值操作符:
widget & widget::operator=(const widget& rh){
if(this == &rh)
return *this;
delete pb;
pb = new Bitmap(*rh.pb);
reruen *this;
}
这种函数虽然考虑了两者相同的情况,但是没有考虑当new操作发生异常时 的情况。当异常是,pb会指向已经释放的内存,导致不确定行为。
更好的方式是
widget & widget::operator=(const widget& rh){
Bitmap* porig = pb;
pb = new Bitmao(*rh.pb);
delete porig;
return *this;
}
这里即使两者相同,也不会有问题,只不过多做了一次拷贝,对效率有影响。我们可以考虑将判断语句加进去,但是判断语句会使代码变大,产生新的分支流,这两点都会降低CPU的效率。所以我们应该考虑自我赋值的发生频率有多高。
还有一个替代方案是copyandswap技术:
class widget{
private:
void swap(const widget&rh){}
public:
widget &