码迷,mamicode.com
首页 > 编程语言 > 详细

C++中的默认函数 深拷贝与浅拷贝 深赋值与浅赋值

时间:2016-07-22 15:00:13      阅读:1358      评论:0      收藏:0      [点我收藏+]

标签:c++中6个默认函数   深 浅拷贝 赋值   

1、C++中什么都不写,就有6个默认函数,由系统自动提供:

        构造函数,拷贝构造函数,赋值语句,析构函数,对一般对象的取地址符,对常对象的取地址重载;

对&运算符的重载:

        Test t3;

        Test *pt = &t3;

Test* operator&(){
    return this;
}

对常对象的取地址重载;

const Test t4;

const Test *pt1 = &t4;

const Test* operator&()const{
    return this;
}

2、深拷贝与浅拷贝

#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;

class String{
public:
    String(const char *str = ""){
        if(str == NULL){
            data = new char;
            data[0] = 0;
        }else{
            data = new char[strlen(str) + 1];
            strcpy(data, str);
        }
    }
    ~String(){
        delete []data;
    }
private:
    char *data;
};

int main(void){
    String t1("abcdef");
    String t2 = t1;
    String t3("hello");
    t3 = t1;

    return 0;
}

运行结构如下:

技术分享

可以知道,程序崩了,我们用的是系统默认的拷贝构造函数和赋值语句,此时只是各成员之间的赋值,

技术分享

        两个对象通过默认的拷贝构造,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间;

        此时在最后调用析构函数时,形成了对同一空间的多次释放,是错误操作!!!,这就是浅拷贝。

        两个对象通过默认的赋值语句,成员data之间相互赋值,使得data不同,data的值相同,指向了同一空间,浅赋值。

解决方案,此时应给自己写拷贝构造和赋值语句,达成深拷贝:

    String(const String &s){
        data = new char[strlen(s.data) + 1];
        strcpy(data, s.data);
    }
    String& operator=(const String &s){
        if(this != &s){
            delete []data;
            data = new char[strlen(s.data) + 1];
            strcpy(data, s.data);
        }

        return *this;
    }

        深拷贝和深赋值的意思:就是重新申请空间,各自保存自己的,最后在自己释放自己的,保证了对内存访问的安全性;

        深赋值应当注意以下四步:

        (1)、判断自己是否给自己赋值

        (2)释放原有空间      //有可能在构造对象时,已经指向了某一空间,此时就得先释放,不然就内存泄漏

        (3)、申请空间进行赋值

        (4)、返回引用空间


C++中的默认函数 深拷贝与浅拷贝 深赋值与浅赋值

标签:c++中6个默认函数   深 浅拷贝 赋值   

原文地址:http://11596096.blog.51cto.com/11586096/1828624

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!