zoukankan      html  css  js  c++  java
  • c++的一些个学习及总结

    一、复制构造函数

    1、浅拷贝和深拷贝

    浅拷贝:指的是在对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。大多情况下“浅拷贝”已经能很好地工作了,但是一旦对象存在了动态成员,那么浅拷贝就会出问题了,让我们考虑如下一段代码

    深拷贝:对于对象中动态成员,就不能仅仅简单地赋值了,而应该重新动态分配空间。

    2、深拷贝实现及一些注意事项

      复制构造函数不能使用传值参数,因为当传入的参数是值时,将型参复制到实参时,会调用类自带的复制构造函数,因此如果允许复制构造函数传值,就会在复制构造函数中调用复制构造函数,从而形成无休止的递归调用,进而导致栈溢出。解决方法即将传值改为传const的引用即可。

    class{
      ...
      mstring& operator =(const mstring& other);
    private:
      char* m_data;
    };
    mstring& mstring::operator=(const mstring& str){ //参数设置为引用,避免重复调用复制构造函数,且避免无谓消耗, if(this==&str) //判断是否是自身,如果为自身赋值,当释放自身时,参数str也将被释放,进而无法赋值 return *this; delete[] m_data;//为避免内存泄露,在分配新内存时,先释放已有内存 m_data=nullptr; m_data=new char(strlen(str.m_data)+1);//内存不足,new失败将抛出异常,后续使用将造成程序崩溃 strcpy(m_data,str.m_data); return *this; //只有返回引用,才能连续赋值 }
  • 相关阅读:
    常用的 写代码 的 指令
    boos
    超级搬运工
    那些年,我读过的书籍(读完一本就在此处更新),立贴。
    ExtJs combobox模糊匹配
    整理了一下eclipse 快捷键注释的一份文档
    中国省份按照拼音排序出现的问题以及临时解决方案
    JetBrains WebStorm 安装破解问题
    ExtJs Grid 删除,编辑,查看详细等超链接处理
    ExtJs Panel 滚动条设置
  • 原文地址:https://www.cnblogs.com/socks/p/12950977.html
Copyright © 2011-2022 走看看