赋值函数篇

作者: 君子亮剑 | 来源:发表于2017-03-30 21:14 被阅读0次

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;
}

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

相关文章

  • 赋值函数篇

    1.赋值函数浅拷贝问题: 先看看一段代码: 看看上面代码,感觉跟自己想象的不一样,为什么?就是因为浅拷贝,导致ba...

  • 变量的解构赋值 - 字符串、数值、布尔值、函数参数

    一、字符串的解构赋值 二、数值和布尔值的解构赋值 三、函数参数的解构赋值 变量的解构赋值 - 数组篇[https:...

  • 学习typescript -Type Compatibility

    赋值兼容检查 函数传参类型检查 函数赋值参数兼容 函数赋值返回值兼容 枚举 类 泛型 自行回顾 赋值兼容检查 函数...

  • ES6-函数参数的赋值

    函数参数的解构赋值: 函数参数解构赋值的默认值: 函数参数解构赋值的默认值undefined:

  • JS 函数

    函数的定义 具名函数 匿名函数 箭头函数 构造函数 调用时机 先赋值后调用 先调用后赋值 setTimeout 作...

  • C

    1.函数 void (*p)(); 函数指针;相当于函数变量,可以将函数引用赋值给它,赋值时候不调用 void *...

  • 理解执行上下文

    变量、函数表达式——变量声明,默认赋值undefined; this——赋值; 函数声明——赋值; 这三种数据的准...

  • python中5个常用的内置高阶函数

    python内置常用高阶函数: 一、函数式编程 函数本身可以赋值给变量,赋值后变量为函数; 允许将函数本身作为参数...

  • C++面向对象高级编程(上)-第二周-博览网

    第二周 三大函数:拷贝构造,拷贝赋值,析构 字符串的构造函数,拷贝构造函数, 拷贝构造函数和拷贝赋值函数没有自主定...

  • c++第三讲 类和对象

    目标: 类的默认成员函数 构造函数 析构函数 拷贝构造函数 赋值操作符重载 默认拷贝函数与赋值运算符重载 cons...

网友评论

    本文标题:赋值函数篇

    本文链接:https://www.haomeiwen.com/subject/vcbpottx.html