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

C++笔记:拷贝函数和移动函数

2016-01-10 10:48 405 查看
拷贝构造函数:

在初始化一个类类型时,如果调用拷贝构造函数,就会把传入的参数先拷贝一份副本,再用此副本来进行初始化,格式一般是 class(const class&),一般在用 = 定义变量时使用,如 my_class s1 = s2;此时会调用拷贝构造函数,这里的参数得注意,一定得是引用类型的,假如是非引用的,则你调用拷贝构造函数时,我们需要拷贝它的实参,但为了拷贝实参,我们又需要调用拷贝构造函数,则一直循环。

拷贝赋值运算符:

是一个名为operator= 的函数,也就是为你的类重载 = 运算符,格式是myclass& operator=(const myclass &),返回一个指向左侧对象的引用,在类里就是this,例子:s1 = s2。

移动构造函数:

和拷贝构造函数区别就是不用拷贝实参,而是直接移动,性能上会有提升。格式是class(const class &&) noexcept; class &&是右值引用,是字面常量或表达式求值是创建的临时对象,也可以使用move函数将一个左值对象转化为一个右值对象,如 int &&r1 = std::move(r2); noexcept是通知标准库我们的构造函数不抛出异常。

移动赋值运算符:

与拷贝赋值运算符类似,也是重载 = 运算符,格式是 class& operator=(class &&) noexcept; 

标准库容器、string和shared_ptr类既支持移动也支持拷贝。IO类和unique_ptr类可以移动但不能拷贝。

如果我们自己的类没有定义拷贝构造函数和拷贝赋值运算符,编译器会为我们合成,但是合成的有时候不是我们需要的,当一个类需要一个析构函数时,那么它就需要定义自己的拷贝构造函数和拷贝赋值运算符,拷贝函数通常都是成对出现的。

如果我们的类没有定义移动构造函数和移动赋值运算符,编译器也会为我们自动合成,但是如果我们已经自己定义了拷贝构造函数和拷贝复制运算符,那么编译器就不会为我们合成移动的构造函数和赋值运算符,因为类会使用对应的拷贝操作来替代。

一般来说,这四个函数加上析构函数是一起出现的,即定义其中一个就需要定义其余四个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息