【问题标题】:Copy constructor define and declare difference?复制构造函数定义和声明的区别?
【发布时间】:2013-02-03 17:51:41
【问题描述】:

我有一个基类和派生类。

  1. 如果我在类中声明了复制构造函数,编译器会在编译时定义复制构造函数吗?
  2. 如果调用派生类复制构造函数会发生什么?它是否依赖于基类复制构造函数?

(在标准编译过程中,我需要知道基类和派生之间在复制构造函数方面的关系。编译器是做什么以及如何定义复制构造函数的)

【问题讨论】:

    标签: c++ constructor copy-constructor default-constructor default-copy-constructor


    【解决方案1】:

    如果我在我的类中声明了复制构造函数,编译器会在编译时定义复制构造函数吗?

    没有。不会的。

    如果你只声明复制构造函数而不定义它,你最终会出现链接错误。通过为复制构造函数提供显式声明,您可以告诉编译器隐式生成的声明不足以满足您的需求,并承诺您将提供自己的版本。但是,当您不提供定义时,您就违背了这个承诺。

    如果调用 Derived 类的拷贝构造函数会发生什么?是否依赖Base类拷贝构造函数?

    基类中是否存在复制构造函数不影响派生类中的复制构造函数。规则很简单:
    如果您不提供显式声明,编译器会为您的类生成一个复制构造函数。请注意,仅当您的代码使用复制构造函数时,编译器才会这样做。如果编译器检测到您的代码从不使用复制构造函数,那么它就不会生成复制构造函数,因为这是不必要的开销并且违反了 C++ 的基本规则,“您只需为使用的内容付费”

    【讨论】:

    • 但是,如果你声明了一个私有的拷贝构造函数(通知类不能被拷贝),这个声明就不需要了,因为它不能被调用。而default派生的拷贝构造函数会调用Base拷贝构造函数,所以有一定的依赖关系。
    猜你喜欢
    • 2014-11-26
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2013-05-21
    • 2013-10-04
    • 2018-08-27
    • 2011-05-23
    相关资源
    最近更新 更多