构造函数 如果一个构造函数的第一个参数是自身类类型的引用,且额外参数都有默认值,则此构造函数是拷贝构造函数。 每个成员的类型决定了它如何拷贝:类类型的成员,会使用拷贝构造函数来拷贝;内置类型的成员则直接拷贝。 哪些情况下会使用拷贝初始化 1.用=定义变量时 2.将一个对象作为实参传递给一个非引用类型的形参 3.从一个返回类型为非引用类型的函数返回一个对象 4.用花括号列表初始化一个数组中的元素或一个聚合类中的成员 在函数调用的过程中,具有非引用类型的参数要进行拷贝初始化;当一个函数具有非引用类型的返回值时,返回值会被用来拷贝初始化调用放的结果 为什么拷贝构造函数的第一个参数必须是引用类型 拷贝构造函数被用来初始化非引用类型的参数,如果其参数不是引用类型,则调用永远不会成功。因为为了调用拷贝构造函数,我们必须拷贝它的实参,但是为了拷贝实参,又需要调用拷贝构造函数,这样就会无限循环。拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,右侧运算对象是所属类类型的,作为函数的参数;函数返回指向其左侧对象的引用。 哪些情况下会使用拷贝赋值 当为类对象进行赋值时,会使用拷贝赋值运算符 析构函数 析构函数是类成员函数,不接受参数,也没有返回值;析构函数用来释放对象使用的资源,并销毁非static数据成员。在析构函数中,若函数体不为空,则首先执行函数体,然后销毁成员,成员按初始化的逆序进行销毁 哪些情况下会调用析构函数 1.变量在离开其作用域时被销毁 2.当一个对象被销毁时,其成员被销毁 3.容器被销毁时,其元素被销毁 4.对于动态分配的对象,当对指向它指针应用delete时被销毁 5.对于临时对象,当创建它的表达式结束时被销毁 当指向对象的引用或指针离开作用域时,析构函数不会执行 如果一个类没有定义自己的拷贝构造函数,拷贝赋值运算符和析构函数,则编译器会为它生成一个合成的版本,而这些合成的版本往往达不到我们想要的效果,所以最好是自己定义它们