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

class A {};
class B { public: B (A a) {} };

A a;
B b=a;

С технической точки зрения, здесь применяется конструктор копирования при создании b?

Ответ 1

С технической точки зрения, здесь применяется конструктор копирования при создании b?

Да... но, вероятно, не так, как вы думаете. Конструктор копирования A вызывается при создании b, чтобы выполнить проход по значению параметра A a в качестве параметра для конструктора B.

Однако он не запускает конструктор B-копии при создании b.


РЕДАКТИРОВАТЬ: Каждый узнает что-то новое каждый день. По-видимому, даже более-технически говорящий, как заметил @CharlesBailey... если вы используете синтаксис B b = a; ( "инициализация копирования" ) вместо синтаксиса B b (a); ( "прямая инициализация" ), временное значение типа B может необходимо создать. На этом этапе конструктор экземпляра B будет вызван.

Немного трудно изучить феномен, но Чарльз указывает, что gcc имеет параметр -fno-elide-constructors (также: Википедия на копирование Elision) Ссылка @JesseGood содержит исчерпывающее объяснение и некоторый демонстрационный код:

Есть ли разница в С++ между инициализацией и прямой инициализацией?

Ответ 2

Да, в теории. Это копирование. Сначала временный экземпляр B создается из инициализатора (a), тогда B инициализируется из этого временного с помощью конструктора копирования.

Составители разрешены и часто выполняют временную и конструкцию копирования, хотя и строят B непосредственно из a с помощью конструктора B(A).

Ответ 3

Нет, конструктор копирования ссылается на объект того же типа.

С++ 03 12.1 Конструкторы

  • Конструктор копирования для класса X является конструктором с первым параметром типа X& или const X&.

EDIT: ОК, чтобы быть справедливым (и, прочитав другие ответы), вызывается конструктор копирования, но конструктор A copy. Я думал, вы имели в виду B.

EDIT2: Чтобы быть более справедливым, не нужно вообще его вызывать:

A a;
B b = a;   //called
B c = A(); //probably not called due to copy elision

Ответ 4

Нет. Это не конструктор копирования.

Если вы создаете объект с помощью инициализации с помощью объекта того же класса, который является конструктором копирования.

A a;
A b=a;

Вышеприведенный код - это экземпляр Constructor.