第13章 复制控制(7)
13.5.2 定义值型类
具有值语义的类所定义的对象,其行为很像算术类型的对象,反之亦然。string类是值型类的一个例子。
复制构造函数不再复制指针,它将分配一个新的int对象,并初始化该对象以保存与被复制对象相同的值。每个对象都保存属于自己的int值的不同副本。因为每个对象保存自己的副本,所以析构函数将无条件删除指针。
赋值操作符不需要分配新对象,它只是必须记得给其指针所指向的对象赋新值,而不是给指针本身赋值。
改变的是指针所指向的值,而不是指针。
class HasPtr
{
public:
HasPtr(const int &p, int i):ptr(new int(p)), val(i){}
HasPtr(const HasPtr &orig):ptr(new int(*orig.ptr)), val(orig.val){}
HasPtr &operator= (const HasPtr &);
~HasPtr(){
delete ptr;
}
int *get_ptr() const{ return ptr; }
int get_int() const{ return val; }
void set_ptr(int *p){ ptr=p; }
void set_int(int i){ val=i; }
int get_ptr_val() const{ return *ptr;}
void set_ptr_val(int val) const {*ptr = val;}
private:
int *ptr;
int val;
};
HasPtr &HasPtr::operator= (const HasPtr &hasptr)
{
*ptr = *hasptr.ptr;
val = hasptr.val;
return *this;
}
即使要将一个对象赋值给它本身。赋值操作符也必须总是保证正确。本例中,即使左右操作数相同,操作本质上也是安全的,因此,不需要显式检查自身赋值。
摘自 xufei96的专栏
补充:软件开发 , C++ ,