class A {};
class B { public: B (A a) {} };
A a;
B b=a;
С технической точки зрения, здесь применяется конструктор копирования при создании b?
class A {};
class B { public: B (A a) {} };
A a;
B b=a;
С технической точки зрения, здесь применяется конструктор копирования при создании b?
С технической точки зрения, здесь применяется конструктор копирования при создании b?
Да... но, вероятно, не так, как вы думаете. Конструктор копирования A вызывается при создании b, чтобы выполнить проход по значению параметра A a в качестве параметра для конструктора B.
  Однако он не запускает конструктор B-копии при создании b.
  РЕДАКТИРОВАТЬ: Каждый узнает что-то новое каждый день. По-видимому, даже более-технически говорящий, как заметил @CharlesBailey... если вы используете синтаксис B b = a; ( "инициализация копирования" ) вместо синтаксиса B b (a); ( "прямая инициализация" ), временное значение типа B может необходимо создать. На этом этапе конструктор экземпляра B будет вызван.
Немного трудно изучить феномен, но Чарльз указывает, что gcc имеет параметр -fno-elide-constructors (также: Википедия на копирование Elision) Ссылка @JesseGood содержит исчерпывающее объяснение и некоторый демонстрационный код:
Есть ли разница в С++ между инициализацией и прямой инициализацией?
Да, в теории. Это копирование. Сначала временный экземпляр B создается из инициализатора (a), тогда B инициализируется из этого временного с помощью конструктора копирования.
Составители разрешены и часто выполняют временную и конструкцию копирования, хотя и строят B непосредственно из a с помощью конструктора B(A).
Нет, конструктор копирования ссылается на объект того же типа.
С++ 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
Нет. Это не конструктор копирования.
Если вы создаете объект с помощью инициализации с помощью объекта того же класса, который является конструктором копирования.
A a;
A b=a;
Вышеприведенный код - это экземпляр Constructor.