2011-02-11 73 views
1

我不明白爲什麼在這種情況下複製構造函數沒有被調用。有人可以解釋一下嗎?複製構造函數不叫!

#include <iostream> 

class foo 
{ 
    int* ptr; 
    public: 
    foo() 
    { 
     std::cout << "\n Constructor \n" ; 
     ptr = new int; 
     *ptr = 10; 
    } 

    foo(const foo* &obj) // Copy Constructor 
    { 
     std::cout << "\n Copy Constructor \n" ; 
     ptr = new int; 
     *(this->ptr) = *(obj->ptr); 
    } 

    // Copy Assignment Operator 

    ~foo() // Destructor 
    { 
     delete ptr; 
    } 
}; 

int main() 
{ 
    foo* objOne = new foo; 
    foo* objTwo = objOne ; 

    getchar(); 
    return 0; 
} 

回答

9

因爲你只是創建另一個指針相同對象,而不是一個新的對象:

foo* objOne = new foo; 
foo* objTwo = objOne; 
^
    | 
    +-- these are pointers. 

如果你想有一個新的對象,使用這樣的:

foo objTwo = objOne; 

並修復您的複製構造函數:

foo (const foo &obj) ... 

下面的代碼片段顯示瞭如何做這件事:

#include <iostream> 

class foo { 
    public: 

    foo() { 
     std::cout << "constructor" << std::endl; 
     ptr = new int; 
     *ptr = 10; 
    } 

    foo (const foo &obj) { 
     std::cout << "copy constructor" << std::endl; 
     ptr = new int; 
     *(this->ptr) = *(obj.ptr); 
    } 

    ~foo() { 
     delete ptr; 
    } 

    private: 

    int* ptr; 
}; 

int main() 
{ 
    foo objOne; 
    foo objTwo = objOne ; 
    return 0; 
} 

而這種輸出:

constructor 
copy constructor 

如你所願。

0

只是一個想法,嘗試調用它像這樣:

foo* objTwo(objOne); 
+0

你爲什麼不自己嘗試一下? ;) – visitor 2011-02-11 09:54:20

3
foo(const foo* &obj) 

不是拷貝構造函數

foo(const foo &obj) 

另外,您要複製對象的指針,而不是對象。您無法爲對象指針定義複製構造函數。 C++中通常的解決方案是創建一個包裝指針的智能指針類。參見:

http://en.wikipedia.org/wiki/Smart_pointer

0

複製構造需要參考 const對象作爲參數。

2

您正在將POINTER複製到對象,而不是對象。因此,沒有複製構造函數調用 - 你只是將objTwo分配給與objOne相同的地址。

0

您有一個拷貝構造函數的簽名錯誤...

它不能是一個指針....

foo(const foo &obj)