2011-02-11 111 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)