基础知识:类的拷贝与控制
主要内容:拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符、析构函数
拷贝构造函数:- 形式
class Foo { Foo(const Foo &)//拷贝构造函数 }
拷贝构造函数的第一个参数是自身类型的引用 - 合成拷贝构造函数会将对象中依次每个非static成员拷贝到正在创建的对象中;如果对象的成员中有类,会调用类的拷贝构造函数,如果对象成员有数组,那么合成拷贝构造函数会逐元素拷贝
- 拷贝初始化发生的情况(一般由拷贝构造函数和移动构造函数完成):
- “=”定义变量
- 将一个对象作为实参传递给一个非引用类型的形参:在函数调用的过程中,具有非引用类型的参数要进行拷贝初始化;类似的,当一个函数具有非引用的返回类型时,也会进行拷贝初始化
- 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
- 形式
4、编译器可以通过直接初始化绕过拷贝初始化
- 拷贝赋值运算符
- 形式:
class Foo{ Foo& operator = (const Foo &){
;;;;
return *this
}//赋值运算符}
- 形式:
- 合成拷贝赋值运算符:和拷贝构造函数类似
- 总结:其实就是重载运算符“=”
- 析构函数:释放资源,销毁对象的非static数据成员
- 执行情况:变量离开作用域;对象被销毁;容器被销毁时,其元素也被销毁;动态分配对象的delete;创建临时对象的完整表达式的结束
- 合成析构函数
- 总结:注意RAII的运用;C++管理资源的时候自然形成的最佳表达方式就是RAII
注意:以上的函数可以定义为delete(除了析构函数)
移动构造函数和移动赋值运算符,再说吧,记住和右值引用有关(&&)!