2012-09-07 68 views
1

我正在通過this來研究複製構造函數。複製構造函數的理解

CODE:

#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; 
} 

OUTPUT:

Normal constructor allocating ptr 
Copy constructor allocating ptr. 
Length of line : 10 
Freeing memory! 
Freeing memory! 

我想知道爲什麼它是在Line line(10)調用拷貝構造函數。我認爲它應該只調用正常的構造函數。我在這裏沒有克隆任何對象。請有人向我解釋這一點。

+0

display's obj是行的副本。 – sellibitze

回答

9

複製構造函數被調用是因爲函數參數是按值傳遞的。這裏

void display(Line obj) 

的函數被定義爲通過值取Line參數。這導致了所做參數的副本。假如你按引用傳遞,拷貝構造函數就不叫

3

我想知道爲什麼它是在Line line(10)調用拷貝構造函數。

不,它沒有。
它只是調用Line類構造函數的構造函數,它以int爲參數。


void display(Line obj)  

通行證Line對象由值因此拷貝構造被調用來創建副本被傳遞給函數。

在C++函數參數默認情況下按值傳遞。這些對象的副本通過調用該類的複製構造函數來創建。

+0

好的。知道了謝謝。 – Shashwat