复制构造函数未调用!

时间:2011-02-11 09:06:21

标签: c++ copy-constructor

我不明白为什么在这种情况下不会调用复制构造函数。有人可以解释一下吗?

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

6 个答案:

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

正如您所料。

答案 1 :(得分:3)

 foo( const foo* &obj )

不是复制构造函数

 foo( const foo &obj )

此外,您正在复制对象指针,而不是对象。您无法为对象指针定义复制构造函数。 C ++中通常的解决方案是创建一个包装指针的智能指针类。见:

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

答案 2 :(得分:2)

您正在将POINTER复制到对象,而不是对象。因此,没有复制构造函数调用 - 您只是将objTwo指定为与objOne相同的地址。

答案 3 :(得分:0)

只是一个想法,尝试这样称呼:

foo* objTwo(objOne);

答案 4 :(得分:0)

复制构造函数将引用作为参数传递给const对象。

答案 5 :(得分:0)

复制构造函数的签名错误...

它不能是指针......

foo( const foo &obj )