Копировать конструктор не вызывается! - PullRequest
1 голос
/ 11 февраля 2011

Я не понимаю, почему в этом случае не вызывается конструктор копирования.Кто-нибудь может объяснить, пожалуйста?

#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 ]

9 голосов
/ 11 февраля 2011

Поскольку вы просто создаете другой указатель на такой же объект, а не новый объект:

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

, как и следовало ожидать.

3 голосов
/ 11 февраля 2011
 foo( const foo* &obj )

не является конструктором копирования

 foo( const foo &obj )

есть

Кроме того, вы копируете указатели объектов, а не объекты. Вы не можете определить конструктор копирования для указателей объекта. Обычное решение в C ++ - создать класс интеллектуальных указателей, который обернет указатель. Смотри:

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

2 голосов
/ 11 февраля 2011

Вы копируете указатель на объект, а не на объект.Следовательно, нет вызова конструктора копирования - вы просто назначаете objTwo тот же адрес, что и objOne.

0 голосов
/ 11 февраля 2011

У вас неверная подпись для конструктора копирования ...

Это не может быть указатель ....

foo( const foo &obj )
0 голосов
/ 11 февраля 2011

Конструктор копирования принимает ссылку на объект const в качестве параметра.

0 голосов
/ 11 февраля 2011

Просто идея, попробуйте назвать это так:

foo* objTwo(objOne);
...