C++11:右值引用和转移赋值

1、左值与右值的区别:

左值:能别赋值的值;能取到地址的值,用&能取到地址,具有持久性;

右值:临时变量;不能用&取到地址;只是字面常量值

2、右值引用

一般用的是左值引用,用&标识

右值引用通过&&获得,只能绑定到将要销毁的对象

如下例子:在代码里面进行了标识:

 

class MemoryBlock {

public:

    //构造器

    explicit MemoryBlock(int length) : length_(length), data_(new int[length]()) {

    }

 

    virtual ~MemoryBlock() {

        if (data_) {

            delete[] data_;

            data_ = nullptr;

        }

    }

    //拷贝构造,左值引用

    MemoryBlock(const MemoryBlock &src) : length_(src.length_), data_(new int[src.length_]()){

        std::copy(src.data_, src.data_+length_, data_);

    }

 

     //普通的赋值,左值引用

    MemoryBlock& operator=(const MemoryBlock &src) {

        if (this != &src) {

            delete[] data_;

 

            length_ = src.length_;

            data_ = new int[length_]();

            std::copy(src.data_, src.data_+length_, data_);

        }

        return *this;

    }

 

    //移动构造器,右值引用

    MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_) noexcept  {

        src.length_ = 0;

        src.data_ = nullptr;

    }

 

    //移动赋值

    MemoryBlock& operator=(MemoryBlock &&src) noexcept  {

        if (this != &src) {

            delete[] data_;

 

            length_ = src.length_;

            data_ = src.data_;

 

            //将传入的参数设置为空 释放传入的数据

            src.length_ = 0;

            src.data_ = nullptr;

        }

        return *this;

    }

 

private:

    int length_;

    int *data_;

};

 

MemoryBlock f() {

    return MemoryBlock(50);

}

 

int main()

{

    std::cout << "11111111" << std::endl;

    MemoryBlock a = f();    // 调用构造器

    MemoryBlock b = a;      //拷贝构造

    MemoryBlock c = std::move(a);// 移动构造器,移动语义

    a = f();    // 调用移动赋值运算符,移动语义

    b = a;      // 调用赋值运算符

    c = std::move(a); // 调用移动赋值运算符,移动语义

 

    return 0;

}

    //移动构造器

    MemoryBlock(MemoryBlock&& src) : length_(src.length_),data_(src.data_)  noexcept {

        src.length_ = 0;

        src.data_ = nullptr;

    }

  1. 、将入参传给成员
  2. 、释放传入的数据.

总结:移动构造、移动赋值仅仅是将原来存在的资源移动到其他的位置。因此其自身的资源将会被释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[备忘]Visual Studio常用小技巧

1. 怎样调整代码排版的格式&#xff1f; 选择&#xff1a;编辑—>高级—>设置文档的格式 或 编辑—>高级—>设置选中代码的格式。 格式化cs代码&#xff1a;Ctrlkf 格式化aspx代码&#xff1a;Ctrlkd 2. 怎样跳转到指定的某一行&#xff1f; 两种方法&#…

Angular CLI的简单使用(1)

参考地址: https://v2.angular.cn/docs/ts/latest/cli-quickstart.html Angular CLI是一个命令行界面工具&#xff0c;它可以创建项目、添加文件以及执行一大堆开发任务&#xff0c;比如测试、打包和发布。 1. 请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 如下图,没有…

在没有数据集的情况下使用数据表

使用数据适配器填充数据表 View Code using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient;namespace PopDataTable {class Program{static void Main(string[] args){string connString…

2019年文章汇总

要不要去培训机构深造一下&#xff1f;我一个37岁的程序员朋友Linux内核中的GPIO系统整理的免费资料&#xff0c;帮你年后跳槽C语言&#xff0c;字符串指针做函数参数书籍推荐过年回家抢票攻略C语言&#xff0c;函数不可返回指向栈内存的指针你还会写这段C51程序吗&#xff1f;…

一种简单的LRU cache设计 C++

最近在工作中需要用到LRU cache用作缓存来提高性能&#xff0c;经过查阅各种资料&#xff0c;了解了其运行的机制&#xff0c;如下&#xff1a; LRU cache可以用于在内存中保持当前的热点数据&#xff0c;下面实现一个有大小限制的lru cache&#xff0c;相关如下&#xff1a; …

开博了,喜欢这里的气氛

开博了&#xff0c;喜欢这里的气氛 以后经常写东西 学PHP不久&#xff0c;很多东西需要学习 我的站点 www.zhibowang.cn www.xzld.com转载于:https://www.cnblogs.com/gxphp/archive/2009/04/05/1429819.html

bsgs整理

目录 bsgs问题 或 poj2417&#xff1a;概述代码exbsgs鸣谢 \(gzy gzy gzy\)bsgs问题 或 poj2417&#xff1a; 给定质数\(p\)&#xff0c;给定\(a\),\(b\),\((a,p)1\) 求出最小的整数x&#xff0c;使得\(a^{x}≡b(mod p)\) 概述 由费马小定理可以知道\(a^{xp-1}≡a^{x}≡b(mod p…

两个指针变量可以相减

两个指针变量可以相减转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/23/3845529.html

linux下修改max_user_processes和open_file的最大值

从事分布式服务器开发工作的都会遇到&#xff0c;linux下open_file的值默认是1024&#xff1b;max user processes的值默认是4096&#xff0c;在实际用于中&#xff0c;这两个值严重不足&#xff0c;常常需要调整这两个值。默认配置如下&#xff1a; 可以通过以下两种方式修改&…

Silverlight 全屏显示

privatevoidFullScreenButton_Click(objectsender, RoutedEventArgs e) { Application.Current.Host.Content.IsFullScreen Application.Current.Host.Content.IsFullScreen?false:true; }转载于:https://www.cnblogs.com/star250/archi…

IP SLA的路径控制

一、定义SLA 服务水平协议&#xff08;简称&#xff1a;SLA&#xff0c;全称&#xff1a;service level agreement&#xff09;是在一定开销下为保障服务的性能和可靠性&#xff0c;服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。简…

创业动力衰减 中国面临危险挑战

近日&#xff0c;在翻阅1月份出的一书《赢道&#xff1a;成功创业者的28条戒律》时&#xff0c;对目前国内的创业形势产生了近乎激动的想法。从目前的创业情况看&#xff0c;我认为&#xff0c;中国80年代青年的创业动力正在衰减&#xff0c;对照2005年—2007年间各种创业沙龙如…

【linux】linux系统中常见配置文件及目录说明

1.配置文件/proc/sys/fs/file-nr 里文件里显示三个数字 [rootlocalhost logs]# cat /proc/sys/fs/file-nr 2112 0 2100000已分配文件句柄的数目 已使用文件句柄的数目 文件句柄的最大数目 上面第二项的值为0表示分配的文件…

6-14 数据库高级

--先通过设计器手动添加&#xff0c;然后通过代码来添加--手动增加约束--手动删除一列(删除EmpAddress列) alter table Employees drop column EmpAddress go--手动增加一列(增加一列EmpAddr varchar(1000)) alter table Employees add EmpAddr varchar(1000)--手动修改一下Emp…

ptmalloc,tcmalloc和jemalloc内存分配策略研究

转载&#xff1a;https://cloud.tencent.com/developer/article/1173720 操作系统内存布局 各种malloc的内存分配管理方式离不开操作系统的内存布局策略。 32位经典内存布局 32位系统下经典内存布局如上&#xff0c;程序起始的1GB地址为内核空间&#xff0c;接下来是向下增长…

AJAX之表单即时验证

最近互联网上比较火热的话题当然是关于WEB2.0的应用&#xff0c;其中AJAX又是WEB2.0的核心之一。AJAX是Asynchronous JavaScript and XML 的缩写。它并不是一门新的语言或技术&#xff0c;它实际上是几项技术按一定的方式组合在一在同共的协作中发挥各自的作用&#xff0c;它包…

黄聪:PHP获取MAC地址(转)

<?php /** 获取网卡的MAC地址原码&#xff1b;目前支持WIN/LINUX系统 获取机器网卡的物理&#xff08;MAC&#xff09;地址 **/ class GetMacAddr{ var $return_array array(); // 返回带有MAC地址的字串数组 var $mac_addr; function GetMacAddr($o…

Tcmalloc

Tcmalloc Ptmalloc在性能上还是存在一些问题的&#xff0c;比如不同分配区&#xff08;arena&#xff09;的内存不能交替使用&#xff0c;比如每个内存块分配都要浪费8字节内存等等&#xff0c;所以一般倾向于使用第三方的malloc。 Tcmalloc是Google gperftools里的组件之一。…

今天学习的成果

其实主要搞的是数组 还有就是宏的使用。 现将数组代码列出如下&#xff1a; array(){ int a[10],i; printf("Please Input array value"); for(i0;i<10;i) scanf("%d",&a[i]); for(i0;i<10;i) printf("a[%d]%d\n",i,a[i]);} 功能很简…

JVM自动内存管理机制——Java内存区域(下)

一、虚拟机参数配置 在上一篇《Java自动内存管理机制——Java内存区域&#xff08;上&#xff09;》中介绍了有关的基础知识&#xff0c;这一篇主要是通过一些示例来了解有关虚拟机参数的配置。 1、Java堆参数设置 a&#xff09;下面是一些简单的使用参数 其中最后一个是一个运…