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类可以移动但不能拷贝。
如果我们自己的类没有定义拷贝构造函数和拷贝赋值运算符,编译器会为我们合成,但是合成的有时候不是我们需要的,当一个类需要一个析构函数时,那么它就需要定义自己的拷贝构造函数和拷贝赋值运算符,拷贝函数通常都是成对出现的。
如果我们的类没有定义移动构造函数和移动赋值运算符,编译器也会为我们自动合成,但是如果我们已经自己定义了拷贝构造函数和拷贝复制运算符,那么编译器就不会为我们合成移动的构造函数和赋值运算符,因为类会使用对应的拷贝操作来替代。
一般来说,这四个函数加上析构函数是一起出现的,即定义其中一个就需要定义其余四个。
在初始化一个类类型时,如果调用拷贝构造函数,就会把传入的参数先拷贝一份副本,再用此副本来进行初始化,格式一般是 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类可以移动但不能拷贝。
如果我们自己的类没有定义拷贝构造函数和拷贝赋值运算符,编译器会为我们合成,但是合成的有时候不是我们需要的,当一个类需要一个析构函数时,那么它就需要定义自己的拷贝构造函数和拷贝赋值运算符,拷贝函数通常都是成对出现的。
如果我们的类没有定义移动构造函数和移动赋值运算符,编译器也会为我们自动合成,但是如果我们已经自己定义了拷贝构造函数和拷贝复制运算符,那么编译器就不会为我们合成移动的构造函数和赋值运算符,因为类会使用对应的拷贝操作来替代。
一般来说,这四个函数加上析构函数是一起出现的,即定义其中一个就需要定义其余四个。
相关文章推荐
- C++友元函数与拷贝构造函数详解
- C++拷贝构造函数(深拷贝与浅拷贝)详解
- C++中拷贝构造函数的总结详解
- c++中拷贝构造函数的参数类型必须是引用
- 关于拷贝构造函数和赋值运算符
- c++ 拷贝构造函数
- C++中的拷贝构造函数和赋值函数
- C++ 拷贝构造函数和赋值构造函数
- C++复制构造函数以及赋值操作符
- 深拷贝
- C++类的六个重要函数
- Inside the c++ object model读书笔记之拷贝构造函数(三)
- Inside the c++ object model读书笔记之拷贝构造函数(二)
- Inside the c++ object model读书笔记之拷贝构造函数(一)
- C++拷贝构造函数(深拷贝,浅拷贝)
- C++关于析构函数和拷贝构造函数何时调用两个例子的理解
- C++拷贝构造函数详解
- 【C++】基类与子类拷贝构造函数的调用顺序
- 拷贝构造函数的作用
- C++ 类赋值运算符函数