копировать конструктор по адресу - PullRequest
1 голос
/ 22 марта 2010

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

Foo(Foo &obj){

}
Foo(Foo *obj){

}

Когда будет вызван второй конструктор копирования?

Ответы [ 4 ]

10 голосов
/ 22 марта 2010

Нет, нет, у вас есть один конструктор копирования

Foo( Foo * obj );

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

Foo a;
Foo b( & a );   // use your constructor

Обратите внимание, что ваш реальный конструктор копирования должен быть объявлен как;

Foo( const Foo & f );

хотя отсутствие const не мешает ему быть конструктором копирования.

5 голосов
/ 22 марта 2010

Оставляя в стороне, что второй конструктор не является конструктором копирования - вы действительно хотели знать, когда будет вызван второй конструктор.

Конструктор Foo(Foo* obj); является конструктором с одним параметром - поскольку он не был помечен ключевым словом explicit, он обеспечивает неявное преобразование из Foo* в Foo. Его можно вызывать в любое время, когда вместо Foo или const Foo& используется Foo* - если он вызывается неожиданно, это почти наверняка происходит.

Как правило, конструкторы с одним параметром должны быть либо конструкторами копирования (что объяснили другие ответы), либо должны быть помечены explicit. Конструкторы, которые обеспечивают неявные преобразования, должны использоваться экономно.

2 голосов
/ 22 марта 2010

Один из ваших конструкторов является конструктором копирования, другой - просто обычным конструктором.

Второй будет вызываться, если вы явно инициализируете Foo из указателя на Foo или в других ситуациях.где требуется преобразование из указателя в Foo в r-значение Foo, такое как передача аргументов и возврат функций.

Обычно такое неявное преобразование плохая идея;это может произойти, когда вы этого не ожидаете и можете превратить тривиальные опечатки из ошибок компиляции в необычное поведение во время выполнения.

2 голосов
/ 22 марта 2010

Второй не является конструктором копирования. Это конструктор, который вызывается при создании нового объекта Foo, давая указатель на Foo в качестве параметра.

Foo foo0;
Foo foo1 = foo0;  // Calls copy constructor
Foo foo2(foo0);   // Calls copy constructor
Foo foo3(&foo0);  // Calls constructor taking a pointer as parameter
...