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的專欄