class X
{
int i;
public:
X(int m) : i(m) {};
X(const X& x)
{
//cout "copy constructor is called\n";
}
const X opearator++(X& a,int)
{
//cout "X++ is called\n";
X b(a.i);
a.i++;
return b;
}
void f(X a)
{ }
};
int main()
{
X a(1);
f(a);
a++;
return 0;
}
这里调用函数'f'时,复制构造函数按预期调用。在++的情况下,调用operator ++函数,但是当它返回“不调用复制构造函数”时。 为什么“从函数'运算符++'返回时没有调用复制构造函数?
答案 0 :(得分:11)
我相信您遇到了返回值优化(RVO) http://en.wikipedia.org/wiki/Return_value_optimization
答案 1 :(得分:7)
每个C ++程序员都必须阅读全网络着名的C ++ FAQ Lite(例如,here)。
你的问题可能与那个问题相对应:
[10.9] Does return-by-value mean extra copies and extra overhead?
答案 2 :(得分:3)
当从函数返回对象时,允许编译器忽略对复制构造函数的调用。
也就是说,不需要实际调用复制构造函数:它只需构造要在函数返回对象所需的任何位置返回的对象。
答案 3 :(得分:2)
看起来像RVO(返回值优化)。您的编译器发现您没有对“b”实例执行任何操作,也没有对其返回的副本执行任何操作,因此会从编译的输出中删除它(对象复制操作)。
答案 4 :(得分:0)
即使复制构造函数有副作用,也可以合法复制副本。它被称为RVO(还有一个用于命名(评论:谢谢)值,NRVO)并且标准明确允许这样做。
答案 5 :(得分:0)
嗯,你的代码中有几处错误。如果您编译并运行我附加的代码,您将看到当operator ++返回时成功调用了复制构造函数。
#include <iostream>
class X {
public:
X(int m) : i(m) {};
X(const X& x)
{
std::cout << "Copy constructor is called\n";
}
X
operator++(int)
{
std::cout << "X++ is called\n";
this->i++;
return *this;
}
private:
int i;
};
void
f(X a)
{
}
int
main(void)
{
X a(1);
f(a);
a++;
return 0;
}