• 对象切割与临时对象


    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、注意:传递参数只有两种类型:传值与传引用。传指针本质上也是传值,因为指针本身也是一个类型。

  • 相关阅读:
    微软WP7本地数据库之Sqlite编程技巧(转)
    AutoResetEvent详解
    桥接模式的简单分析
    解决VS2008 调试启动特别慢
    软件概要设计
    解决windows8不能安装ZUNE的问题
    CDATA的对特殊字符作用说明
    DataTable对象在内存中的使用(二)
    DataTable对象在内存中的使用(一)
    关于MVC3 CODE FIRST的安装
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3546456.html
Copyright © 2020-2023  润新知