范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C辨析浅复制深复制移动语义下的移动复制

  浅复制(默认、复制构造函数,赋值操作符重载):当涉及到动态内存时,不安全;
  深复制(默认、复制构造函数,赋值操作符重载):当涉及到动态内存时,安全;
  移动语义(移动构造函数,移动赋值操作符重载):一种特殊的浅复制定义(右值引用),用来避免不必要的副本机制和临时对象的创建与删除。
  要实现移动语义,需要采取某种方式,让编译器知道什么时候需要复制,什么时候不需要。这就是右值引用发挥作用的地方。可定义两个构造函数。其中一个是常规复制构造函数,它使用const左值引用作为参数,这个引用关联到左值实参;另一个是移动构造函数,它使用右值引用作为参数,该引用关联到右值实参。复制构造函数可执行深复制,而移动构造函数只调整记录。在将所有权转移给新对象的过程中,移动构造函数可能修改其实参,这意味着右值引用参数不应 是const。
  代码:// stdmove.cpp -- using std::move() #include  #include  // use the following for g++4.5 // #define nullptr 0 // interface class Useless { private:     int n;          // number of elements     char * pc;      // pointer to data     static int ct;  // number of objects     void ShowObject() const; public:     Useless();     explicit Useless(int k);     Useless(int k, char ch);     Useless(const Useless & f); // regular copy constructor     Useless(Useless && f);      // move constructor     ~Useless();     Useless operator+(const Useless & f)const;     Useless & operator=(const Useless & f); // copy assignment     Useless & operator=(Useless && f);      // move assignment      void ShowData() const; };  // implementation int Useless::ct = 0;  Useless::Useless() {     ++ct;     n = 0;     pc = nullptr;  }  Useless::Useless(int k) : n(k) {     ++ct;      pc = new char[n]; }  Useless::Useless(int k, char ch) : n(k) {     ++ct;     pc = new char[n];     for (int i = 0; i < n; i++)         pc[i] = ch; }  Useless::Useless(const Useless & f): n(f.n)  {     ++ct;     pc = new char[n];     for (int i = 0; i < n; i++)         pc[i] = f.pc[i]; }  Useless::Useless(Useless && f): n(f.n)  {     ++ct;     pc = f.pc;       // steal address     f.pc = nullptr;  // give old object nothing in return     f.n = 0; }  Useless::~Useless() {     delete [] pc; }  Useless & Useless::operator=(const Useless & f)  // copy assignment {     std::cout << "copy assignment operator called: ";     if (this == &f)         return *this;     delete [] pc;     n = f.n;     pc = new char[n];     for (int i = 0; i < n; i++)         pc[i] = f.pc[i];     return *this; }  Useless & Useless::operator=(Useless && f)       // move assignment {     std::cout << "move assignment operator called: ";     if (this == &f)         return *this;     delete [] pc;     n = f.n;     pc = f.pc;     f.n = 0;     f.pc = nullptr;     return *this; }  Useless Useless::operator+(const Useless & f)const {     Useless temp = Useless(n + f.n);     for (int i = 0; i < n; i++)         temp.pc[i] = pc[i];     for (int i = n; i < temp.n; i++)         temp.pc[i] = f.pc[i - n];     return temp; }  void Useless::ShowObject() const {      std::cout << "Number of elements: " << n;     std::cout << " Data address: " << (void *) pc << std::endl; }  void Useless::ShowData() const {     if (n == 0)         std::cout << "(object empty)";     else         for (int i = 0; i < n; i++)             std::cout << pc[i];     std::cout << std::endl; }  // application int main() {     using std::cout;     {         Useless one(10, "x");         Useless two = one +one;   // calls move constructor         cout << "object one: ";         one.ShowData();         cout << "object two: ";         two.ShowData();         Useless three, four;         cout << "three = one ";         three = one;              // automatic copy assignment         cout << "now object three = ";         three.ShowData();         cout << "and object one = ";         one.ShowData();         cout << "four = one + two ";         four = one + two;         // automatic move assignment         cout << "now object four = ";         four.ShowData();         cout << "four = move(one) ";         four = std::move(one);    // forced move assignment         cout << "now object four = ";         four.ShowData();         cout << "and object one = ";         one.ShowData();     }      std::cin.get(); }
  通过提供一个使用左值引用的构造函数和一个使用右值引用的构造函数,将初始化分成了两组。 使用左值对象初始化对象时,将使用复制构造函数,而使用右值对象初始化对象时,将使用移动构造函数。 程序员可根据需要赋予这些构造函数不同的行为。
  ref
  StephenPrata:《C++ Primer Plus(6th 2011)》
  -End-

人的一生中总是有那么几次机会的,抓住了你就成了人上人(一)无论我们在成长过程中做什么行业,记住往往是选择大于努力。努力只是在做选择前的准备,当我们做好了准备。选择的时候却停滞不前,或因犹豫而错失良机就如同只知道埋头苦干,却不知道方向到珠宝店购买首饰时,必须掌握的一些知识人们在生活中,尤其是一些女性朋友,喜欢购买一些黄金首饰或者是珠宝玉器佩带。既起到了装饰的作用,又能张显自己的高贵的身份和品质。如果你踏入了珠宝店的大门,你会发现现在市面上一般的珠宝生活中的小窍门天气变冷的注意事项作者半支烟2020年的脚步就要过去,崭新的一年即将来临。寒冬天气,气温骤降,雪花飘零。朋友们的生活,或多或少都受到了一定的影响吧?冬景冷热交替的天气,给我们日常的工作生活出行带来诸职场生活中的丛林法则说出来你就会认可记得著名影帝黄渤说过你弱的时候,身边全是欺负你的坏人你强的时候,身边全是帮助你的好人。这个社会就是这么现实,如果你弱谁都可以欺负你。你要么有钱,要么有权,要么有用。实在不行,你狠也居家生活中几个有刺激性的食材,你是怎么处理的导读居家生活免不了吃穿住行。而吃又排在生活的首位,因为我们不可能饿着肚子去穿住行。吃饭之前得去做饭菜,而做饭菜少不了跟以下几个食材接触。而这些食材在变成食物之前,具有一定的刺激皮肤生活小窍门正在准备年货的可得进来看看作者半支烟今天是2020年12月22号,再过几天就到元旦了,今年的春节是2021年2月11号,也就是说离中国最大的传统节日春节,总共只有五十天了。美女和手机来了就给大家送福利温馨提生活小窍门如何轻松打开各种盖子大家好,我是生活达人小江。昨天,在百度上看到一个女网友(男生一般没什么问题的)想吃罐头了。可是她力气很小,没有办法打开这个罐头的瓶盖。她尝试了很多方法才吃到这个罐头,最后发给我的图职场生活中被别人人身攻击怎么办前篇文章我就说过,当一个人表现得很弱的时候,就容易受到别人的踩踏。著名企业家曹德旺说过你所有的动心起念,正如我父亲讲的,决定了你结果的方方面面。职业女性01。hr人生初见我和小雨是利用通讯光纤进行地震监测,是科技让我们的生活更安心说到光纤,大家的第一个反应应该就是数据传输了。但其实光纤不仅仅能传输数据,还能探测周边发生的事件,甚至包括地震最初期的底层声音。过去一年,斯坦福大学的地球物理学教授BiondoBi1969年美国阿波罗登月事件到底是造假还是真实的?关于美国人是否登月的争论一直就没断过,在我看来都是阴谋论而已,说来说去也就是旗子在飘什么的,而每种质疑也都有貌似合理的解释,但是你是否知道各种所谓的怀疑和阴谋仔细想一想却是多么的可刘强东被释放已回国解密事件真相近两天,最火爆的人物非刘强东莫属!于美国当地时间8月31日晚间,在参加商务活动时,刘强东被美国警方以涉嫌构成犯罪的性行为带走调查,9月1日下午被释放,没有被要求缴纳任何保释金。这则
研究人员成功开发出一种使分子尺度电气元件成为可能的分子瑞典隆德大学的研究人员成功开发出一种简单的碳氢化合物分子,该分子具有逻辑门功能,类似于晶体管中的功能。这一发现可能在未来能使分子尺度上的电气元件成为可能。该成果已发表在Nature中国科大首次实现波导模式编码量子逻辑门中国科学技术大学郭光灿院士团队在光量子芯片研究中取得重要进展。该团队任希锋研究组与浙江大学光电科学与工程学院现代光学仪器国家重点实验室戴道锌团队合作,国际首次实现了片上波导模式编码研究发现矿物指纹能表明它是否受到陨石碰撞的影响图片来源SLAC国家加速器实验室当一块太空岩石在穿过地球大气层的湍流通道中幸存下来并撞击地表时,它会产生冲击波,可以压缩和转化地壳中的矿物质。由于这些变化取决于撞击时产生的压力,专地球有多古老?罕弗莱斯这里列举十二个自然现象。它们与认为宇宙存在了数十亿年的进化论观点相悖。我在下面列出的数字中,粗体的是由某一过程所决定的最大可能年龄(多为数百万年),而非实际年龄。斜体的数字是进化论木星比某些恒星还要大,为什么它不是恒星?未来它能变成恒星吗?木星是太阳系内最大的行星,它以其巨大的质量和强大的引力,吸引了大量来自太阳系外的小行星,或偏离它们的运行轨道,或直接将它们拉入怀抱,从而极大减少了这些系外天体对太阳系内部的威胁,特中国首次发现混翅鲎化石板足鲎是生存于古生代的一类重要的节肢动物,是现代蛛形纲的近亲。因其形似蝎子,故俗称为海蝎。记者从中国科学院南京地质古生物研究所获悉,中外科研人员在华南地区发现志留纪的混翅鲎(hu)人类文明要实现质的飞跃,可能需要五个质变的科技,你知道几个?天文学家阿尔伯特爱因斯坦虽然人类诞生的时间已经有200多万年,但是人类文明形成到现在的时间不过才5000多年。5000多年的岁月,人类文明不断发展前进,终于在数百年前走进了科技发展宇宙中会不会存在一种全是水的星球,就像水珠一样漂浮在宇宙中?综述众所周知,宇宙是非常大的,在我们人类目前来说可以观测到的范围,直径都达到了930亿光年。也就是说,如果人类能够发明出速度可以达到光速的超级航天飞船,想要跨出这个已知的宇宙空间,我国计划今年发射首颗太阳探测卫星中国的探日时代即将到来。28日,第十三届中国国际航空航天博览会在广东珠海开幕,现场展出了由中国航天科技集团八院抓总研制的太阳双超卫星。该院专家向中青报中青网记者透露,作为中国首颗太你知道星云和星团的区别吗?(2)星团恒星往往成群分布,常常爱好群居。有许多恒星是成双成对地紧密靠在一起的,按照一定的规律互相绕转着,它们被称为双星。还有一些是3颗4颗或更多颗恒星聚集在一起,它们被称为聚星。中科院最新科研进展科技动态2021。9。29星期三科研进展1。云南天文台日冕物质抛射研究获进展2。南京古生物所等在中国首次发现混翅鲎化石3。上海天文台等获得星际最大类肽键分子观测证据4。心理所关于面部表情加工的大脑网络研究获进展5