使用参数复制构造函数作为派生类的引用

时间:2014-11-23 06:19:20

标签: c++ constructor

复制构造函数有以下定义:

  

X的非模板构造函数是一个复制构造函数   第一个参数的类型为X&const X&volatile X&const volatile X&,   并且要么没有其他参数,要么全部   其他参数有默认参数(8.3.6)。

请注意,定义与convertions无关,但以下程序运行正常:

#include <iostream>

struct B{ };

struct A : B
{
    A(){ }
    A(const B&){ }
};

B b;
A a = b;


int main(){ }

DEMO

并生成输出

B()
B()
A(const B&)

我不清楚,我预计程序不会打印A(const B&),因为定义A(const B&)不是复制构造函数,因此一个被隐含地定义为A::A(const A&)默认初始化,不会产生任何副作用。

难道你不能澄清这个原因的错误吗?

2 个答案:

答案 0 :(得分:1)

A a = b;

这会调用A类的转换构造函数。

A(const B&){ }   << This is conversion constructor for class A which defines conversion from B to A

和我们宣布的一样

A(int i) {}  << Convert int to class A object.

即使你删除了A类和B类之间的关系,它也会导致构造函数调用。

答案 1 :(得分:1)

这称为转换构造函数(第12.3.1节)。 b已复制初始化为a,并且A::A(const B&)被选中以执行转换。转换结果用于直接初始化a