关于移动操作的一个问题

《C++ Primer》学习第13章中,关于移动操作:

 1 #include <string>
 2
 3 class Foo {
 4 public:
 5     Foo(int a, int b, std::string c="") :x(a), y(b), s(new std::string(c)) {}
 6     Foo(const Foo&) = default;
 7     Foo& operator=(const Foo &) = default;
 8     Foo(Foo&&) noexcept= default;
 9     Foo& operator=(Foo &&) noexcept= default;
10     ~Foo() {}
11
12     int x = 42;
13     int y = 12;
14     std::string* s;
15 };
16 int main()
17 {
18     Foo v(26, 12, "s");
19     int *p = &(v.x);
20     int *p2 = &(v.y);
21
22     Foo v2(std::move(v));
23     int *pp = &(v2.x);
24     int *pp2 = &(v2.y);
25     return 0;
26 }

运行结果如下:

有以下疑问:

  1. 移动构造函数对内置类型是怎么操作的?运行结果显示为类值拷贝(int值相同,地址不同)。书上没细说,仅说明编译器对内置类型进行移动操作,书中的例子均在移动构造函数中特意值初始化了当前对象。这样看起来移动构造函数只是对内置类型进行了拷贝操作,书上代码的初始化时多余的?
  2. 移动构造函数对类类型的资源进行了“窃取”,同书上结论一致,为移动操作。
时间: 2024-12-26 08:21:09

关于移动操作的一个问题的相关文章

NOIP 考前 图论练习

LJOJ 1500: 题目:http://www.docin.com/p-601990756.html Sol:贪心,从叶子结点往上加入无法传递了,就需要建设. Dfs返回的是到达叶子节点最多所要的能量,如果大于最大能量就需要建设放大器. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 const int Maxn=100100;

13.6对象移动

1.左值和右值 左值:非临时对象,可以在多条语句里面使用的对象. 右值:临时对象,只能在本条语句里面使用. 如:int i = 0;//i是持久对象,能在多条语句里面使用,0是临时对象,只能在本条语句里面使用 2.左值引用和右值引用 在C++11以前,右值不能被引用,最大限度就是用常量引用绑定一个右值:const int &a = 1 左值引用:& 右值引用:&& 如下: void process_value(int& i) { std::cout <<

【C++】C++的拷贝控制

目录结构: contents structure [-] 拷贝.赋值与销毁 拷贝构造函数 拷贝初始化 参数和返回值 拷贝赋值运算符 析构函数 三五法则 拷贝控制和资源管理 交换操作 对象移动 右值引用 标准库move函数 移动构造函数 移动赋值运算符 合成的移动操作 定义一个类,会显式或隐式指定此类型的对象拷贝.移动.赋值和销毁时做什么.类通过定义五种特殊的成员函数来控制这些操作,包括:拷贝构造函数(copy constructor).拷贝赋值运算符(copy-assignment operat

1033:Defragment 模拟

描述您正在参与“新一代”操作系统和NG文件系统的开发.在该文件系统中,所有磁盘空间被分成相等大小的N个簇,由1到N的整数编号.每个文件占据盘的任意区域中的一个或多个簇.未被文件占用的所有群集都被视为免费.如果文件的所有集群都以自然顺序位于连续的磁盘集群中,则可以以最快的方式从磁盘读取文件.以恒定速度旋转磁盘意味着访问其集群需要不同的时间量.因此,读取位于磁盘开头附近的簇比读取位于其末端附近的簇执行得更快.因此,所有文件都按照从1到K的整数按照访问频率下降的顺序编号.在文件在磁盘上的最佳放置下,文

也来山寨一个2048

2048最近似乎热度已过,但是并不影响我山寨一个它.周末闲来无事,终于付诸实现,包含winform和js版本.有图有真相  实现思路: 1.通过二维数组data=int[4][4]来存储游戏数据,初始全部为0 2.游戏初始在4X4布局中随机位置产生2个随机数(只随机2,4) //初始化游戏数据 void InitGame() { ClearGame(); Random rand = new Random(); int pos1 = Convert.ToInt32(rand.Next(16));

C++ 右值引用与移动操作

右值引用和移动操作是C++11提出的新概念,通过这些操作,可以降低拷贝操作带来的消耗.先来简单介绍一下左值和右值. 左值一般指的是一个对象,或者说是一个持久的值,例如赋值的返回值.下标操作.解引用以及前置递增等. 右值是一个短暂的值,比如一个表达式的求值结果.函数返回值以及一个字面值等. 为了区分,把一般的引用称为左值引用,必须绑定到右值的引用称为右值引用,以&&表示.右值引用有这两个特性: 右值引用只能绑定到临时对象,所引用的对象将要被销毁,并且没有其他用户. 这也意味着,我们可以自由地

重构一个功能块的总结

因为Leader不建议占用上班时间搞这个,基本上都是加班搞的 在做这个事的过程中,对IntelliJ idea更加熟悉,回顾下Mocikitto中spy,mock,verify,when的使用,这次重构基本上是小步快走,层层分离 IntelliiJ idea:重构手法:如果想把一个方法移动到另一个class中,可以通过method增加一个Class类型的参数,然后将光标放在方法名的任何字符上[若选中方法名,则F6会失效],按F6,在弹出的对话框中选择预期的Class[因为这个方法的参数是其它类型

cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友

本文翻译自国外著名IOS源码教学商业网站raywenderlich 的IOS Game Start Kits三件套之一的Platformer Game/平台动作游戏的前奏曲,另一个是Beat'Em up Game/横版格斗游戏,作者是国外著名游戏开发专家Jake Gundersen,曾参与开发过SFC时代的洛克人X系列. 原文网址: http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-br

HBase底层存储原理——我靠,和cassandra本质上没有区别啊!都是kv 列存储,只是一个是p2p另一个是集中式而已!

理解HBase(一个开源的Google的BigTable实际应用)最大的困难是HBase的数据结构概念究竟是什么?首先HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式. Google's BigTable论文 清楚地解释了什么是BigTable: Bigtable是一个疏松的分布式的持久的多维排序的map,这个map被行键,列键,和时间戳索引.每一个值都是连续的byte数组.(A Bigtable is a sparse