首页 > 其他分享 >拷贝构造函数 和 移动构造函数 深拷贝

拷贝构造函数 和 移动构造函数 深拷贝

时间:2023-07-19 15:00:14浏览次数:21  
标签:obj1 构造函数 other MyClass 拷贝 移动 data size

采用了深拷贝的方式,obj2 和 obj3 的 data 成员变量指向不同的内存空间,因此可以独立地释放资源而不会出现重复释放的问题.

class MyClass {
public:
    int* data;
    int size;

    // 默认构造函数
    MyClass() : data(nullptr), size(0) {}

    // 拷贝构造函数(深拷贝)
    MyClass(const MyClass& other) : size(other.size) {
        if (other.data != nullptr) {
            data = new int[size];
            for (int i = 0; i < size; i++) {
                data[i] = other.data[i];
            }
        }
        else {
            data = nullptr;
        }
    }

    // 移动构造函数(深拷贝)
    MyClass(MyClass&& other) noexcept : data(other.data), size(other.size) {
        other.data = nullptr; // 将原始对象的指针置为空,避免悬挂指针
        other.size = 0;
    }

    // 析构函数
    ~MyClass() {
        delete[] data;
    }
};

int main()
{
    
    // 创建对象1
    MyClass obj1;
    obj1.size = 5;
    obj1.data = new int[obj1.size];
    for (int i = 0; i < obj1.size; i++) {
        obj1.data[i] = i;
    }

    // 使用拷贝构造函数创建对象2
    MyClass obj2 = obj1;

    // 使用移动构造函数创建对象3
    MyClass obj3 = std::move(obj1);

    // 输出对象2和对象3的data值
    std::cout << "obj2.data: ";
    for (int i = 0; i < obj2.size; i++) {
        std::cout << obj2.data[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "obj3.data: ";
    for (int i = 0; i < obj3.size; i++) {
        std::cout << obj3.data[i] << " ";
    }
    std::cout << std::endl;

    // 释放资源
    delete[] obj2.data;
    delete[] obj3.data;
    return 0;
}

  

标签:obj1,构造函数,other,MyClass,拷贝,移动,data,size
From: https://www.cnblogs.com/susiesnai-sun/p/17565593.html

相关文章

  • 移动端实现横向滚动(隐藏横向滚动条)
    如何实现横向滚动(兼容safari,微信,浏览器)实现横向滚动需要以下几点:1、父级盒子要overflow-y:hidden;overflow-x:auto来防止页面宽度溢出,以及实现左右滚动效果2、::-webkit-scrollbar{display:none;}隐藏横向滚动条(此方法在ios和微信端无效),所以第5步实现兼容3、滚动条所存......
  • 拷贝构造函数 和 移动构造函数的 浅拷贝
    classMyClass{public:int*data;//默认构造函数MyClass():data(nullptr){}//拷贝构造函数(浅拷贝)MyClass(constMyClass&other):data(other.data){}//移动构造函数(浅拷贝)MyClass(MyClass&&other)noexcept:data(other.data......
  • 《C++》拷贝和替换算法
    copy复制容器元素到新容器 vector<int>v3; v3.resize(v1.size()); copy(v1.begin(),v1.end(),v3.begin());replace元素值替换 replace(v3.begin(),v3.end(),0,100);//replace(开始,结束,旧值,新值);replace_if条件元素值替换classFindCondition{public: booloperator()(......
  • 伪负载均衡(拷贝多个流程
    数厂代码,未实现伪负载均衡//伪负载均衡/*;(()=>{letnodes=JSON.parse(JSON.stringify(data.nodes));letedges=JSON.parse(JSON.stringify(data.edges));//排查特殊节点并记录letstart_node=null,......
  • 深拷贝函数
    1functiondeepClone(oldData){2if(typeofoldData==='object'&&oldData!==null){3letres=Array.isArray(oldData)?[]:{}4for(letkinoldData){5......
  • python脚本,把整个文件夹移动至指定位置并对文件夹重新命名
    Python脚本-移动和重命名文件夹概述在本文中,我将介绍如何使用Python编写一个脚本,将整个文件夹移动到指定位置并对文件夹进行重新命名。这个脚本适用于那些刚入行的开发者,帮助他们理解如何使用Python处理文件和文件夹。步骤下面是完成这个任务的步骤列表:步骤代码说明......
  • postcss-px-to-viewport 插件移动端适配
    1.简介:postcss-px-to-viewport是一个将px单位转换为视口单位的(vw,vh,vmin,vmax)的PostCSS插件。将CSS中的px单位转化为vw,来进行移动端适配,1vw等于1/100视口宽度。2.地址:postcss-px-to-viewportGitHub地址3.安装:npmnpminstallpostcss-px-to-viewport--save-......
  • 文件内指针的移动 、内数据的修改 、函数(次函数非数学中的函数)(非常重要)
    文件的操作模式"""1.如果是t模式,read里面写的数字代表的是读取的字符个数2.如果是b模式,read里面写的数字代表的是读取的字节个数3.一个字节代表一个英文字符4.一个中文字符使用三个字节保存"""#withopen('a.txt','r',encoding='utf8')asf:#......
  • APP加固:助力移动应用安全合规
    近日,工业和信息化部发布了2023年第2批侵害用户权益行为的App(SDK)名单,55款App因涉及强制、频繁、过度索取权限等问题而被通报。这一举措进一步凸显了合规对于APP发展的重要性。根据工业和信息化部的通报,被通报的这些App存在着一些消费者难以察觉的问题,如频繁自启动和关联启动、超范......
  • 零拷贝
     所谓零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在IO读写过程中。目前市面上大部分的高性能软件,比如Nginx、Kafka等等,都有零拷贝的身影。我们通过一个传统IO读取文件,然后通过网络发送的例子来入手,详情看下图: 由上图可知,在一个简单的文件读取发送的过程中,......