首页 > 解决方案 > 为什么调用复制构造函数

问题描述

我无法理解为什么调用复制构造函数而不是编译错误。

我已经声明了两个独立的类 AB 。A 不是基于/派生于 B。它们之间的唯一联系是在 BI 中使用将 B 转换为 A 的运算符我定义了一个运算符 =,它作为参数获取 B 的 const 引用。在 main 中,我编写了以下实例B = A 的实例。我预计会产生编译错误。但是运算符 = 被调用

class A {};

class B {
public:
    // conversion from A (constructor):
    B()
    {

        cout << "1." << endl;
    }
    B(const A& x)
    {
        cout << "4." << endl;
    }
    // conversion from A (assignment):
    B& operator= (const B& x)
    {
        cout << "3." << endl;
        return *this;
    }
    // conversion to A (type-cast operator)
    operator A() {
        cout << "2." << endl;
        return A();
    }
};

int main()
{
    A foo;
    B bar;    // calls constructor
    bar = foo;      // calls assignment
                    //foo = bar;      // calls type-cast operator
    char c;
    c = getchar();
    return 0;
}

我期望编译错误。但是下面的序列被打印 1 4 3 。我几乎不明白如何调用复制构造函数以及为什么 operator = 不会产生问题

谢谢

标签: c++constructoroperator-keyword

解决方案


它不是您拥有的复制构造函数,而是转换构造函数。调用转换构造函数是因为您可以将 aA转换为B.

做这个:

explicit B(const A& x)

现在您将禁止从Ato的隐式转换B

当你这样做时:

bar = foo;

编译器会寻找合理的操作,最多允许一次转换。它可以使用来自 的复制赋值B,并且它知道它可以从 a 创建一个BA因为构造函数不是显式的),所以它默默地执行此操作。

正如@lubgr 所说,clang-tidy 有一个检查这些的规则,这是C++ 核心指南的一部分


推荐阅读