1、判断是copy构造还是copy赋值,不是看是否有赋值操作符=,而是看对象当前是否已经有值了。如果没有值,就是copy构造。如果已经有值了,就是copy赋值。
2、对象赋值的时候,源端与目标端类型不吻合,肯定要进行一次适配(而且只能是一次),中间产生一个临时对象。
3、比如:Person p; p = 6; copy赋值的时候,要求rhs是个const Person&,显然6不是。因此,这里适配一下,用6构造一个临时对象,然后rhs指向这个临时对象。
那么接着思考,子类对象赋值给父类对象,会造成对象切割。那么这个过程是否产生临时对象呢?Person p; Student s; p=s;
那我们分析一下,copy赋值的时候,类型是否吻合。Person& operator=(const Person& rhs) ,显然,rhs可以指向s,类型吻合,因此不产生临时对象。
4、思考一下,copy构造中的形参为什么是引用?Person (const Person& rhs);
引用可以避免复制对象,这只是表面原因。还有更深层次的原因。考虑,如果copy构造为Person(const Person rhs);
Person p1 = p2; 调用copy构造,用p2构造rhs,而这个过程有需要调用copy构造,这将导致无限递归下去。
如果copy构造的形参是指针呢?引用要求右端是个对象,而指针要求右端是个对象地址,copy构造的形参使用指针,它就不是copy构造方法了,而是一个普通的构造方法。
5、注意:传递参数只有两种类型:传值与传引用。传指针本质上也是传值,因为指针本身也是一个类型。