当前位置:编程学习 > C/C++ >>

第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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,