为什么在为现有对象分配新值时会绕过复制构造函数
在提供的代码片段中,对象 a 被初始化为值 5。标准 A 构造函数按预期调用。然而,与假设相反的是,在对新构造的对象进行赋值时,并没有调用复制构造函数。
这种行为既不是编译器优化的结果,也不是语言规范中的遗漏。它在 C 标准中明确记录(§12.8.15,第 211 页)。该标准规定以下赋值在语义上是等价的“完全可以接受”:
T = x; T(x);
从逻辑上讲,可以从代码优化中删除像 T(T(x)) 这样的冗余赋值。因此,编译器会自动调用默认构造函数来初始化 a,然后直接对新构造的对象进行赋值。
要强制调用复制构造函数,需要在赋值之前显式默认构造 a:
A a; // Default-construct 'a' // Copy constructor will be called to // copy data from the newly constructed object. a = A(5);
以上是为什么在 C 中分配给现有对象时不调用复制构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!