您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: