关于默认和复制构造函数

乔纳森·H

考虑以下代码:

#include <iostream>

struct A
{
    A() {} // Can't be commented
    A( const A& other ) =delete;
    int i;
};

struct B : public A
{
    B( int j ) { this->i = j; }
    B( const B& other ) { this->i = other.i; }
};

int main()
{
    B b(42);
    std::cout << b.i << std::endl;
}

如果注释A的空构造函数,为什么不能编译此代码?我以为A总是有一个默认的构造函数,当我禁用其复制构造函数时会发生什么变化?

伊娃(Ivaylo Strandjev)

如果您声明了至少一个非默认构造函数,则编译器将不会为您生成一个默认构造函数。如果您想一想,这实际上是有道理的。想象一下一个可以创建的类,而无需将某些值传递给构造函数。在这种情况下,无论您尝试多少,都将无法创建空的构造函数。

当您注释掉A的空构造函数时,B的构造函数将无法调用它。

当您注释掉两个构造函数时,编译器都认为可以为副本和空构造函数生成默认实现。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++复制构造函数和默认构造函数

复制构造函数和默认赋值运算符

存在移动和复制构造函数时,C ++默认构造函数未使用“ using”继承

使用匿名对象时,默认构造函数和复制构造函数均未调用

C ++构造函数和复制构造函数

没有默认构造函数的奇怪的C ++复制构造函数

用Java中的默认构造函数复制构造函数

删除默认C ++复制和移动构造函数和赋值运算符的缺点?

当MyType没有默认构造函数和复制构造函数时,如何向vector <MyType>中添加元素?

是否可以有一个默认的复制构造函数和一个模板化转换构造函数?

NPE关于构造函数和超类

复制构造函数+浅复制和深复制

复制构造函数和移动构造函数的工作方式

用户定义的构造函数和隐式默认构造函数

用基类的复制构造函数替换默认的复制构造函数(C ++)

gcc 4.8.2在此默认默认构造函数中调用复制构造函数时是否正确?

在链表中移动和复制构造函数

C ++-直接和复制构造函数

自动和复制构造函数:怎么了?

隐式转换和复制构造函数

Python构造函数和默认值

Lombok @Builder和JPA默认构造函数

继承和重载默认构造函数

默认移动构造函数和引用成员

默认和显式构造函数

结构指针(地址)和默认构造函数

模板类和遍历的默认构造函数

关于结构构造函数和析构函数的行为-C ++

为什么用户定义的复制构造函数调用基本构造函数,而默认的复制构造函数没有?