c++ - 为什么调用复制构造函数
问题描述
我无法理解为什么调用复制构造函数而不是编译错误。
我已经声明了两个独立的类 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 = 不会产生问题
谢谢
解决方案
它不是您拥有的复制构造函数,而是转换构造函数。调用转换构造函数是因为您可以将 aA
转换为B
.
做这个:
explicit B(const A& x)
现在您将禁止从A
to的隐式转换B
。
当你这样做时:
bar = foo;
编译器会寻找合理的操作,最多允许一次转换。它可以使用来自 的复制赋值B
,并且它知道它可以从 a 创建一个B
(A
因为构造函数不是显式的),所以它默默地执行此操作。
正如@lubgr 所说,clang-tidy 有一个检查这些的规则,这是C++ 核心指南的一部分。
推荐阅读
- ruby-on-rails - 为什么 Rails + webpack + split chunking 在 localhost 上提供缓慢的请求?
- python - 如何使用 pyspark 在数据块中循环数据框列
- angular - 离子:仅使用 Safari 时为 401
- sql - SQL SUM OVER PARTITION BY 2 列不起作用
- python - 从 Pyqt5 图表中获取值
- angular - Keycloak Spring boot 后端和 Angular 前端,CORS 错误
- dataweave - 在 Mulesoft 中将一种 XML 格式转换为另一种 XML 格式
- save - 如何将文件保存到服务器:PhpSpreadsheet
- r - 如何访问 Shiny renderUI 中的输出,并将它们写入多个 .csv / .zip
- javascript - 在threejs中设置缓冲区几何顶点颜色而不是颜色的透明度