拷贝构造函数和赋值运算符的行为比较相似,都是将一个对象的值复制给另一个对象,但是其结果却有些不同,拷贝构造函数使用传入对象的值生成一个新的对象的实例,而赋值运算符是将对象的值复制给一个已经存在的实例。这种区别从两者的名字也能轻易的分辨出来,拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。
调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生,如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。
拷贝构造函数调用时机
-
使用=定义变量时。
-
将一个对象作为实参传递给一个非引用类型的形参时,这也解释了为什么拷贝构造函数自己的参数必须是引用类型,如果其参数不是引用类型,则会陷入死循环。
-
从一个返回类型为非引用类型的函数返回一个对象时。
-
用花括号列表初始化一个数组中的元素或以个聚合类中的成员时。
-
标准库容器调用insert或push添加成员时。