C++:移动构造和移动赋值
2016-04-01 12:42
330 查看
移动构造和移动赋值
在C++98中,我们自定义的类,会默认生成拷贝赋值操作符函数和拷贝赋值函数以及析构函数;
在C++11中,依赖于新增的move语义,默认生成的函数多了2个移动相关的:移动赋值操作符(moveassignment)和移动构造函数(moveconstructor);
BS建议,如果你显式声明了上述5个函数或操作符中的任何一个,你必须考虑其余的4个,并且显式地定义你需要的操作,或者使用这个操作的默认行为。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将不会默认自动生成move操作。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将默认自动生成所有的拷贝操作。但是,我们应该尽量避免这种情况的发生,不要依赖于编译器的默认动作。
如果你声明了上述5个默认函数中的任何一个,强烈建议你显式地声明所有这5个默认函数。例如:
template<class T>
class Handle {
T* p;
public:
Handle(T* pp) : p{pp} {}
// 用户定义构造函数: 没有隐式的拷贝和移动操作
~Handle() { delete p; }
Handle(Handle&& h) :p{h.p}
{ h.p=nullptr; };
// transfer ownership
Handle& operator=(Handle&& h)
{ delete p; p=h.p; h.p=nullptr; }
// 传递所有权
Handle(const Handle&) = delete;
// 禁用拷贝构造函数
Handle& operator=(const Handle&) = delete;
// ...
};
FROM: http://www.itatedu.com/news/wa2016032916002955299190.shtml
在C++98中,我们自定义的类,会默认生成拷贝赋值操作符函数和拷贝赋值函数以及析构函数;
在C++11中,依赖于新增的move语义,默认生成的函数多了2个移动相关的:移动赋值操作符(moveassignment)和移动构造函数(moveconstructor);
BS建议,如果你显式声明了上述5个函数或操作符中的任何一个,你必须考虑其余的4个,并且显式地定义你需要的操作,或者使用这个操作的默认行为。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将不会默认自动生成move操作。
一旦我们显式地指明(声明,定义,=default,或者=delete)了上述五个函数之中的任意一个,编译器将默认自动生成所有的拷贝操作。但是,我们应该尽量避免这种情况的发生,不要依赖于编译器的默认动作。
如果你声明了上述5个默认函数中的任何一个,强烈建议你显式地声明所有这5个默认函数。例如:
template<class T>
class Handle {
T* p;
public:
Handle(T* pp) : p{pp} {}
// 用户定义构造函数: 没有隐式的拷贝和移动操作
~Handle() { delete p; }
Handle(Handle&& h) :p{h.p}
{ h.p=nullptr; };
// transfer ownership
Handle& operator=(Handle&& h)
{ delete p; p=h.p; h.p=nullptr; }
// 传递所有权
Handle(const Handle&) = delete;
// 禁用拷贝构造函数
Handle& operator=(const Handle&) = delete;
// ...
};
FROM: http://www.itatedu.com/news/wa2016032916002955299190.shtml
相关文章推荐
- C++之类型转换
- 移动构造-C++11
- C++中结构体和类型的sizeof()
- C++ 大数模板
- Visual C++(MFC)实现C/S
- 1152: 【C语言训练】计算:t=1-1/(2*2)-1/(3*3)-...-1/(m*m)
- 2016蓝桥杯C/C++A组填数字
- VC++中,如何定义callback函数和它的触发事件?
- 利用享元模式模拟网站对象建立 C++
- C++ 使用开源库里.h文件和.lib文件的步骤
- 使用C语言解析URL
- C/C++中的移位运算
- c语言字符数组与字符串的使用详解
- 第1周 《C语言及程序设计》资料3——C语言中转义字符
- C++ 访问属性
- 51单片机 C语言中全局变量的使用extern
- 深入理解C++的动态绑定和静态绑定
- 第1周 《C语言及程序设计》实践项目1——指针及其运算
- 一个关于友元和继承的问题
- 第1周 《C语言及程序设计》资料2——C语言中数学函数