【问题标题】:member functions and the copy constructor成员函数和复制构造函数
【发布时间】:2011-12-08 10:40:20
【问题描述】:

您必须在复制构造函数中明确列出要复制的所有成员,这意味着您可以设置复制构造函数来复制对象的缩减版本。

但是成员函数复制是如何工作的呢?是否自动包含所有成员函数?这是因为对象实际上只是成员,而函数只是声明了如何使用类?这是否意味着理论上您可以使用复制构造函数创建缩减对象,然后,例如,调用 getter 来获取副本中不存在的成员?

【问题讨论】:

  • 所以您想知道是否可以创建缺少某些成员的对象的副本?或者您想知道是否可以创建缺少某些方法的副本?
  • 不能缺少某些成员。但是,这些成员中的数据可能会丢失。如果您不复制数据,那么它就不存在。尽管如此,仍然会为该属性分配内存。至于不复制方法,如下所述,那是不可能的。

标签: c++ copy-constructor


【解决方案1】:

成员函数不存储在类实例中。它们只是常规功能。但是可以存储一个 vtable 指针。用于虚成员函数的动态调度。

普通的成员函数调用是在编译时确定的。

(附带说明,有些语言确实会为每个实例存储方法的副本,尽管 C++ 不是其中之一)

【讨论】:

    【解决方案2】:

    函数的每个实例没有单独的实例; (非静态)成员函数的特点不是它会为每个实例实例化,而是它必须在实例上调用,并且会隐式接收指向该实例的指针。没有功能的复制。 (事实上​​,函数——无论是成员函数还是其他函数——都不能被复制。)

    【讨论】:

      【解决方案3】:

      对于 C++ 中的类/对象可能存在误解。在某些语言(例如 python)中,对象可以更改(新变量/函数);在 C++ 中,对象是静态的,在类中指定,因此不能缩小对象的版本。

      默认的复制构造函数已经做了一个成员到成员的复制。如果这还不够(浅拷贝 深拷贝),您必须提供您自己版本的复制构造函数,您必须在其中完成所有复制。未能复制成员将留下未定义或默认成员的复制版本。最好通过避免动态内存等来避免必须制作自己的副本构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 2013-10-13
        • 1970-01-01
        • 2019-03-15
        相关资源
        最近更新 更多