我尝试编写一个简单的代码来理解重载运算符和复制构造函数的工作原理。但我堆在一个地方。这是我的代码
#include <iostream>
using namespace std;
class Distance
{
private:
int feet;
int inches;
public:
// required constructors
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
Distance(Distance &D){
cout<<"Copy constructor"<<endl;
this->feet = D.feet;
this->inches = D.inches;
}
// overload function call
Distance operator()(int a, int b, int c)
{
Distance D;
// just put random calculation
D.feet = a + c + 10;
D.inches = b + c + 100 ;
return D;
}
};
int main()
{
Distance D1(11, 10);
Distance D2 = D1(10, 10, 10); // invoke operator() why here copy constructor is not called
return 0;
}
我的问题是:为什么要在这一行主
中Distance D2 = D1(10, 10, 10); // invoke operator() why here copy constructor is not called
未调用复制构造函数。它不应该首先调用重载运算符,然后去复制构造函数吗?为什么会出错?
答案 0 :(得分:3)
下面:
D2 = D1(10, 10, 10);
您拨打operator()
中的D1(10, 10, 10)
,然后拨打operator=
。
如果要调用复制构造函数,则需要执行以下操作:
Distance D2(D1);
只是一个提示:看看复制构造函数签名 - 它显示了你应该如何调用它。
答案 1 :(得分:3)
这是因为D2
已经存在。您已使用
Distance D1(11, 10), D2;
^
所以=
的含义是operator=
。该对象已分配新值(此新值来自对operator() ( int, int, int)
的{{1}}的调用)而非已创建(已构建)具有某些值
要调用复制构造函数,您需要在其创建行
中为对象赋值D1
但
int main() {
Distance D1(11, 10);
Distance D2( D1); // calls copy ctor
Distance D3 = D1; // calls copy ctor
return 0;
}