zoukankan      html  css  js  c++  java
  • C++对象的赋值和复制


    本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。

    13.对象的赋值和复制

    对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。
    对象1 = 对象2;//浅拷贝 浅复制

    Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针
    Box *b2;
    b1 = b2; //浅拷贝
    delete b1;
    delete b2;//同一块地址 删了2次
    
    Box b1 = Box(123);
    Box b2;
    b2 = b1;//位复制方式给b2赋值 想当于b1的内存完全copy给b1
    //当这里给b2赋值时,回到时b2的p指针和b1的p指针指向同一个地方 即b1的p
    //当程序运行结束时,会导致同一个内存在各自的析构函数中释放,累计释放了2次。

    //深拷贝 深复制

    补充:深拷贝和浅拷贝的区别:
    https://www.zhihu.com/question/36370072

    对象的复制:用一个已有的对象快速地多个完全相同的对象。
    //对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值
    //对象复制:已经有一个对象,再创建另一个对象时,用已知的对象初始化创建对象

    对象复制的一种形式:

    Box box2(box1);//类名 对象2(对象1);
    //用对象1复制出对象2 建立对象时调用了一个特殊的构造函数——copy构造函数(copy constructor)
    //the copy constructor definition 详见课本101页
    Box :: Box(const Box&b) {
        height = b.height;
        width = b.width;
        length = b.length;
    }

    对象复制的另一种形式:

    Box box2 = box1;//类名 对象1 = 对象2;

    两者区别:
    对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行对象的赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象的完全相同(包括对象的结构和成员的值)。

     c3 = c1.complex_add(c2);//此处存在对象的赋值和复制问题

    //对象的复制,存在于实参到形参以及函数的返回中

    //实现机制实例
    //重载=号实现对象赋值
    Person& operator= (Person &s) {
        puts("oper");
        if(this == &s)  return s;
        char *t = new char[srelen(s.p) + 1];
        strcpy(t, s.p);
        delete []p;
        p = t;
        return this*;
    }
    //Copy构造函数实现对象复制
    Person (const Person& s) {
        puts("cp cntr");
        p  = new char[strlen(s.p) + 1];
        strcpy(p, s.p);
    }
  • 相关阅读:
    Coursera机器学习week1 单元测试
    Coursera机器学习week1 笔记
    Apache服务器
    yum软件包安装
    linux察看安装包有那些
    虚拟上怎么挂载镜像
    netstat -altp
    MongoDB——》聚合查询(project、match、limit、skip、unwind、group、sort)
    jdk8流list转Map
    Spring Boot 和 Spring Cloud Feign调用服务及传递参数踩坑记录(转)
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842634.html
Copyright © 2011-2022 走看看