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

Copy constructor with a parameter as a reference to a derived class

本文关键字:派生 引用 参数 复制 构造函数      更新时间:2023-10-16

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

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(){ }

演示

它产生输出

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

我不清楚,我希望程序不会打印A(const B&),因为根据定义,A(const B&)不是复制构造函数,因此隐式定义为具有默认初始化的A::A(const A&),这不会产生任何副作用。

你能澄清一下这个原因有什么问题吗?

称为转换构造函数 (§12.3.1)。 b通过复制初始化为a并选择A::A(const B&)来执行转换。转换结果用于直接初始化a

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 之间的关系,也会导致该构造函数调用。