赋值函数篇

1.赋值函数浅拷贝问题:

先看看一段代码:

//base.h
#ifndef BASE_H
#define BASE_H
#include <stddef.h>

class Base
{
    private:
      ptr;
      size_t len;
  public:
    Base(const char *val);
    ~Base();
    void print() const;
    void init(const char *val);
  };

 //base.cpp
#include <iostream>
#include <string.h>
using namespace std;
Base::Base(const char *val) : ptr(val),len(0)
{
   init(val);
}
void Base::init(const char *val)
{
  if(val)
    {
        len = strlen(val);
        ptr = new char[len + 1];
        bzero(ptr,len + 1);
        strncpy(ptr,val,len);
    }
}
  
Base::~Base()
{
    if(ptr)
    {
      delete ptr;
      ptr = NULL;
    }
    len = 0;
}
void Base::print() const
{
    std::cout << "ptr: " << (ptr ? ptr :" ") << " len:" << len << std::endl;
}

int main()
{
    Base base1("1");
    base1.print();
    //测试
    {
        Base base2("2");
        base2.print();
        base1 = base2;
    }
    base1.print();
    return 0
}

看看上面代码,感觉跟自己想象的不一样,为什么?就是因为浅拷贝,导致base1对象中的ptr指向的那块内存永远的被丢失,而且,base1中的ptr指向了base2中的ptr(实际上已经被释放掉了),浅拷贝只适合系统内建类型的数据,为了防止这种情况,我们必须在赋值函数里面实现深拷贝(所谓深拷贝,就是拷贝对象的每一个字节),代码如下:

//base.h
Base&  operator= (const Base& base);
inline const char* getPrt() const
{
    return ptr;
}
//base.cpp
Base& operator= (const Base& base)
{
    //如果是自己给自己赋值
    if(&base == this)
    {
        return *this;
    }
    if(ptr)
    {
        delete ptr;
        ptr = NULL;
        len = 0;
      }
      init(base.getPtr());
      return *this;
}

上面我们实现了赋值函数,运行一下,发现结果跟我们预想的一样!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容