首页 > 编程语言 >C++primer练习13.49-54

C++primer练习13.49-54

时间:2022-08-16 16:58:23浏览次数:54  
标签:std HasPtr 13.49 54 move 运算符 拷贝 primer 赋值

练习13.49

为你的String类添加一个移动构造函数和一个移动赋值运算符

String(String&& a):elements(std::move(a.elements)),first_free(std::move(a.first_free)),cap(std::move(a.cap)){
            a.free();
        }
        String& operator=(String&&a){
            if(this!=&a)
            {
                free();
                elements=std::move(a.elements);
                first_free=std::move(a.first_free);
                cap=std::move(a.cap);
            }
            return*this;
        }

练习13.50

在你的String类的移动操作中添加打印语句,观察避免拷贝情况

::在内存满了的时候push_back会调用移动构造函数

练习13.51

虽然unique_ptr不能拷贝,但我们编写过一个clone函数,它是以值方式返回一个unique_ptr。解释为什么合法能工作?

::有移动构造函数,但是没有拷贝构造函数,只能移动不能拷贝

练习13.52

详细解释第478页中的HasPtr对象的赋值发生了什么?特别是,一步一步描述hp,hp2以及HasPtr的赋值运算符中的参数rhs的值发生了什么变化

::hp=hp2这里hp2是左值,且调用赋值运算符,由于参数非引用则会进行拷贝构造,然后生成临时对象(分配了内存空间),调用swap,函数结束随之销毁

而hp=std::move(hp2);这里hp2是右值,则会调用移动构造临时参数,这样hp2就被销毁了,而临时对象在函数结束后销毁

练习13.53

从底层效率来看,HasPtr的赋值运算符并不理想,解释为什么?为HasPtr实现一个拷贝赋值运算符和一个移动赋值运算符,并比较你的新的移动赋值运算符中执行的操作和拷贝并交换版本中执行的操作

    HasPtr& operator=(const HasPtr&a){
        ps=    a.ps;
         cout<<"kb"<<endl;
        return *this;
        }
        HasPtr& operator=(HasPtr&&a)noexcept{
        ps=a.ps;
        a.ps=nullptr;
        cout<<"yd"<<endl;
        return *this;
        }

避免参数拷贝的多余开销

练习13.54

如果我们定义了移动赋值运算符,但未改变swap的拷贝交换运算符,会发生什么?

::存在二义性

[Error] ambiguous overload for 'operator=' (operand types are 'HasPtr' and 'std::remove_reference<HasPtr&>::type {aka HasPtr}')

 

标签:std,HasPtr,13.49,54,move,运算符,拷贝,primer,赋值
From: https://www.cnblogs.com/yddl/p/16592088.html

相关文章

  • C-Primer-Plus-第一章-初识C语言
    第一章初识C语言参考书籍:CPrimerPlus(第6版)中文版一、前言打算跟着本书系统地学习一遍C语言,谨以此系列文章记录自己的学习之路。二、主要内容1.C语言起源1972年......
  • 洛谷 P1654 OSU!
    思路考虑\(DP\)转移,设\(F[i]\)表示长度为\(i\)序列的期望分数。得到如下转移:\(F[i]=(F[i-1]-A[i-1]+A[i])p_i+F[i-1](1-p_i)\)其中\(A[i]\)的意义是:以\(i\)......
  • CF1545B AquaMoon and Chess(要不再看一下?)
    题目大意:你有一个长为\(n\)的棋盘,这个棋盘上有一些棋子,你可以进行如下操作:如果第\(i+2\)个位置是空的,且第\(i+1\)个位置非空,则可以将第ii个位置的棋子......
  • NC15447 wyh的问题
    题目链接题目题目描述我国现在能源消耗非常严重,现在政府有这样一个工作,每天早上都需要把一些路灯关掉,但是他们想让在关闭的过程中所消耗的能源是最少的,负责路灯关闭的工......
  • 《Effective Java》第54条:返回零长度的数组或者集合,而不是null
    《EffectiveJava》第54条:返回零长度的数组或者集合,而不是null一、问题如果一个方法返回类型是list,如果结果为空的情况下返回null的情况并不少见,如下:publicclassShop_......
  • P7154 [USACO20DEC] Sleeping Cows P(DP)
    主要是状态设计比较难想,但其实可以理性地推出来。P7154[USACO20DEC]SleepingCowsP考虑最终一个合法状态是怎么样的:一定是一堆小牛棚,一堆大奶牛,最大的牛棚小于最小的......
  • 牛客小白月赛54 C School(思维)
    https://ac.nowcoder.com/acm/contest/38457/C爆时版本,想不明白D国的时间制度很奇怪,一天有h小时,一小时有m分。位于D国的校长给学生发放了校卡。这种校卡具......
  • 牛客小白月赛54 B.Gaming(差分)
    链接:https://ac.nowcoder.com/acm/contest/38457/B他玩的游戏共有n个挑战房间,和m个debuff。他非常强,只要不是带着所有的debuff,他都能打过boss获得胜利。进入第......
  • 牛客小白月赛54 D-Word(最短路/bfs)
    链接:https://ac.nowcoder.com/acm/contest/38457/D题目描述给你一个包含n个单词的单词表。你需要将单词s以如下操作转换成t。每次改变s的一个字母。你需要保证......
  • 1054 求平均值——20分
    本题的基本要求非常简单:给定N个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[-1000,1000]区间内的实数,并且最多精确到小数点后2位。......