2015-10-22 68 views
2

爲什麼這個代碼在傳遞的對象不是Line類型並且沒有等於操作符/顯式調用時調用拷貝構造函數。線A和線A()之間有區別。
我從網上很多教程,它應該是線路type.I的閱讀是一個新手,C++請幫忙使用不同的參數在C++中拷貝構造函數

#include <iostream> 
    using namespace std; 

class Line 
{ 
    public: 
     int getLength(void); 
     Line(int len);    // simple constructor 
     Line(const Line &obj); // copy constructor 
     ~Line();      // destructor 

    private: 
     int *ptr; 
}; 

// Member functions definitions including constructor 
Line::Line(int len) 
{ 
    cout << "Normal constructor allocating ptr" << endl; 
    // allocate memory for the pointer; 
    ptr = new int; 
    *ptr = len; 
} 

Line::Line(const Line &obj) 
{ 
    cout << "Copy constructor allocating ptr." << endl; 
    ptr = new int; 
    *ptr = *obj.ptr; // copy the value 
} 

Line::~Line(void) 
{ 
    cout << "Freeing memory!" << endl; 
    delete ptr; 
} 
int Line::getLength(void) 
{ 
    return *ptr; 
} 

void display(Line obj) 
{ 
    cout << "Length of line : " << obj.getLength() <<endl; 
} 

// Main function for the program 
int main() 
{ 
    Line line(10); 

    display(line); 

    return 0; 
} 
+0

_「Line A;'和'Line A();'?」_ [Yes]是否有區別(https://en.wikipedia.org/wiki/Most_vexing_parse)。 – nwp

回答

10

這是因爲你的display方法,通過價值接受它的參數- 作爲結果的副本是當你通過論證時做出的。爲了避免副本,聲明參數是一個參考Line,而不是通過增加一個符號,&

void display(Line& obj) 
{ 
    cout << "Length of line : " << obj.getLength() <<endl; 
} 

如果你想確保display方法不會修改Line,也可考慮將其const參考:

void display(const Line& obj) 
{ 
    cout << "Length of line : " << obj.getLength() <<endl; 
} 

那麼你還需要聲明的Line::getLength()方法是const成員函數,否則編譯器將不允許ÿ歐調用它const對象:

int getLength(void) const; 
+0

_/_ _(上帝)。謝謝你。 –

2

一般拷貝構造函數將在下列情況下,被稱爲:

  1. 當一個類的對象是按值返回。
  2. 當該類的一個對象被作爲參數的值傳遞給一個函數時。 這是你的情況
  3. 當一個對象是基於同一類的另一個對象構造的。例如A(obj)
  4. 編譯器生成臨時對象時。