拷贝构造函数和赋值操作符复载

拷贝构造函数其实也是构造函数,只不过它的参数是const的类自身的对象的引用。如果类里没有指针成员(该指针成员指向动态申请的空间),是没有必要编写拷贝构造函数的。

拷贝构造函数常用的三种情况:

(1)定义新对象,用已有对象初始化新对象

(2)对象直接作为参数传递给函数

(3)当函数中的局部对象被返回给函数调用

class CExample
{
public :
     CExample(){pBuffer=NULL; nSize=0;}
     ~CExample(){delete pBuffer;}
     CExample(const CExample&); //拷贝构造函数
    void Init(int n){ pBuffer=new char [n]; nSize=n;}
private :
    char *pBuffer; //类的对象中包含指针,指向动态分配的内存资源
    int nSize;
};
CExample::CExample(const CExample& RightSides) //拷贝构造函数的定义
{
     nSize=RightSides.nSize; //复制常规成员
     pBuffer=new char [nSize]; //复制指针指向的内容
     memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof (char ));
}

赋值操作符重载:用户在使用语句ObjB = ObjA的时候,或许ObjB的pStr已经指向了动态申请的空间,如果直接简单将其指向的地址覆盖,就会导致内存泄露,所以需要对=赋值操作符进行重载,在重载函数中判断pStr如果已经指向了动态申请的空间,就先将其释放。

class CExample
{
     ...
     CExample(const CExample&); //拷贝构造函数
     CExample& operator = (const CExample&); //赋值符重载
     ...
};
//赋值操作符重载
CExample & CExample::operator = (const CExample& RightSides)
{
     nSize=RightSides.nSize; //复制常规成员
    char *temp=new char [nSize]; //复制指针指向的内容 
     memcpy(temp,RightSides.pBuffer,nSize*sizeof (char ));

    delete []pBuffer; //删除原指针指向内容   (将删除操作放在后面,避免X=X特殊情况下,内容的丢失)
     pBuffer=temp;    //建立新指向
    return *this 
}

拷贝构造函数和赋值操作符重载的关系:
赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。所以最后给出的拷贝构造函数的实现可以用赋值操作符的重载来完成。

你可能感兴趣的:(拷贝构造函数,赋值符重载)