使用重载operator()在c ++中复制构造函数

时间:2014-05-12 12:11:34

标签: c++ constructor operator-overloading

我尝试编写一个简单的代码来理解重载运算符和复制构造函数的工作原理。但我堆在一个地方。这是我的代码

 #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

未调用复制构造函数。它不应该首先调用重载运算符,然后去复制构造函数吗?为什么会出错?

2 个答案:

答案 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;
}