zoukankan      html  css  js  c++  java
  • 对象切割与临时对象

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

  • 相关阅读:
    win8 开发之旅(1) 连连看游戏开发 前奏
    win8 开发之旅(2) 连连看游戏开发 项目错误的总结
    常见的排序算法五——堆排序
    我与mongodb 二三事(1)
    常见的排序算法四——直接选择排序
    我与mongodb 二三事(2)
    oracleHelper的使用
    公司A、公司B、公司C……
    javascript调用C#后台程序执行查询
    通过翻译学英语
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3546456.html
Copyright © 2011-2022 走看看