string类之深拷贝的两种写法

来源:互联网 发布:淘宝充错话费追回流程 编辑:程序博客网 时间:2024/05/29 09:38

1 第一种就是普通写法,需要强调的地方不多,代码中有关地方已经给出注释

/*#include<iostream>using namespace std;#class String{public:    //这是系统默认的    String()//这是先给pstr开辟一个空间来存放'\0',注意'\0'的写法        :p(new char[1])    {        *p = '\0';\    }    //显示的给出 开辟空间时候加1是为了放'\0'    //也可以合起来写   改成String(char*p="")    String(char *pstr)        :p(new char[strlen(pstr)+1])    {        if (pstr == NULL)        {            p = new char[1];            *p = '\0';        }        else        {            p = new char[strlen(pstr) + 1];            strcpy(p, pstr);        }    }    拷贝构造函数    String(const String &s)    {        p = new char[strlen(s.p) + 1];        strcpy(p, s.p);    }    //赋值运算符重载    //注意四个问题    //1)返回值    //2)参数    //3)检测其是否给自身赋值    //4)返回为*this      String & operator = (const String &s)    {        if (this != &s)        {            char *tmp = new char[strlen(s.p) + 1];            strcpy(tmp, s.p);            delete []p;            p = tmp;        }        return *this;    }    //析构函数    ~String()    {        if (p)        {            delete[] p;        }    }private:    char *p;};int main(){    String s1;    String s2("aaa");    String s = s2;    String s3(s2);    s2 = s1;    return 0;}*/

2 简洁版的深拷贝 这是重点要掌握的
在这个版本中,构造函数和析构函数并没有改变,改变的是复制运算符重载,拷贝构造
先看这段实现代码

String(const String &s)    {        String tmp(s.p);        std::swap(p, tmp.p);    }    //赋值运算符重载    /*String &operator=( String s)    {        std::swap(p, s.p);        return *this;    }*/    //另一种写法    String & operator=(const String &s)    {        if ( this != &s)        {            String tmp(s.p);            std::swap(p, tmp.p);        }        return *this;    }

看起来这段代码并没有问题,但是运行起来会崩溃
仔细分析一下是因为p没有具体的指向,但是我们却用它和另一个指针交换所指向的内容,我们使用的这个p此时是野指针.
因此在初始化列表里应该将他置空,此时再来交换就没有问题了

这就是深拷贝的简洁版,直接交换俩个指针的指向,易于理解且写起来不易出错

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高中不会写作文怎么办 考试不会写作文怎么办 高考不会写作文怎么办 孩子总是写错字怎么办 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办 孩子考试前失眠怎么办 孩子上网瘾了怎么办 孩子考试差家长怎么办 手指肿痛有脓包怎么办 手指脓出来红肿怎么办 手指提重物发麻怎么办 小孩拧伤了怎么办 从小就成绩差怎么办 孩子考试总马虎怎么办 上课不认真怎么办初中 对学习兴趣不大怎么办 小学生做作业粗心大意怎么办 小学生考试总是粗心大意怎么办 脚趾内侧长鸡眼怎么办 五岁宝宝胆小怎么办 孩子偏食挑食老师怎么办 九岁孩没有耐心怎么办 孩子学习太粗心怎么办 害怕自己变疯怎么办 工作太粗心了怎么办 粗心的宝宝该怎么办 孩子身上起范怎么办 又笨又内向怎么办