zoukankan      html  css  js  c++  java
  • 动态内存管理类、对象移动、移动构造函数和移动赋值运算符

    13.5动态内存管理类
    1.某些类需要自己进行内存分配,这些类一般来说必须定义自己的拷贝控制成员来管理分配的内存。
    2.如果没有可用空间,vector就会重新分配空间,且将已有元素移动(或拷贝,但这里是移动)到空间中,释放旧空间,并添加新元素。

    13.6对象移动
    13.6.1右值引用
    1.我们可以将一个const的引用绑定到一个右值上,非常量引用初始值必须为左值。
    2.右值引用只能绑定右值,后置递增递减运算符生成右值,前置版本生成左值。其两个特性是:所引用的对象将要被销毁,该对象没有其他用户。
    3.任何变量都是左值,包括右值引用类型的变量也是左值,所以不能将右值引用绑定到这些类型上,除非调用标准库move函数,如:int && rr3 = std::move(rr1);调用后rr3将是rr1的别名,他们公用一块内存,相当于左值引用。
    (书上说对于一个移后源,我们可以 销毁和赋值它,但是不能使用它的值,可是我在多种编译器上都输出了它的值,不知道为什么,很迷惑)
    4.使用move的代码应该使用std::move而不是move,这样可以避免潜在的名字冲突。

    13.3.2移动构造函数和移动赋值运算符
    1.将拷贝构造函数的左值引用改为右值引用,就变成了移动构造函数
    2.为了让移动构造函数和移动赋值运算符不抛出异常,必须在参数列表和初始化列表开始的冒号之间标记为noexcept,这个标记在声明和定义出都得加。
    3.移动构造函数必须确保移后源处于一个可销毁但无害的状态,保持有效的、可析构的状态,但是用户不能对其值进行任何假设,其具有一个不确定的状态,对其调用std::move是危险的,当我们调用move时,必须绝对确认以后云对象没有其他用户。
    4.make_move_iterator函数将一个普通迭代器转换为一个移动迭代器。此函数接受一个迭代器参数,返回一个移动迭代器。
    5.防止右值被赋值就是在赋值运算符后加一个&引用限定符。
    6.如果没有声明移动构造函数,那么用std::move转换会调用拷贝构造函数而不是移动构造函数
    如:Copyable news = std::move(s);
    7.move的头文件时utility,move的作用是将一个左值强制转换成一个右值引用类型,从而用于移动语义。
    8.不能解引用一个空指针

  • 相关阅读:
    poj1417(带权并查集+背包DP+路径回溯)
    poj1182(带权并查集)
    hdoj3038(带权并查集)
    poj1611(并查集简单应用)
    poj2236(并查集)
    莫队板子,例题
    离散化二维坐标
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    树链剖分板子
    P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/9412371.html
Copyright © 2011-2022 走看看