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.