这是一个具有3个不同构造函数的类定义,一个默认构造函数,一个参数化整数和一个复制构造函数。 R值对象在创建后立即创建和操作。前两种情况按预期工作,但在最后一种情况下,预计会进行两次构造函数调用,但只会发生第一次。为什么这样?以下是代码。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A() {cout << "In default ctor\n";};
A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;}
A(const A& o) {cout << "In copy ctor, changing i to " << o.i << "\n"; i=o.i;}
void print() {cout << "i = " << i << endl;}
};
int main()
{
A o(10);
A(o).print(); // invokes copy constructor A(const A&) as expected
A(20).print(); // invokes int parametrized constructor A(int)
A(A(30)).print(); // invokes only int constructor A(int) and not copy constructor, why so?
return(0);
}
输出结果为:
Setting i in par-ctor to 10
In copy ctor, changing i to 10
i = 10
Setting i in par-ctor to 20
i = 20
Setting i in par-ctor to 30
i = 30
答案 0 :(得分:4)
C ++标准明确允许编译器在某些情况下省略副本。这被称为复制省略。其中一种情况如你所示:
当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动目标
请注意,复制省略是可选的。你的编译器恰好像A(30).print();
那样处理那一行,但它没有。{/ p>