(1) Поскольку Carrier::add
не принимает аргумент в качестве ссылки, ему передается копия.Чтобы получить ссылку, измените ее подпись на
void Carrier::add(Plan const &p);
(2) Когда вы делаете push_back
, копия создается независимо от того, передаете ли вы Plan
по ссылке или по значению / копии;это часть семантики std::vector
(и всех других стандартных контейнеров).Конструктор копирования автоматически генерируется компилятором.
(3) Я не пользователь VC ++, но конструктор копирования, сгенерированный компилятором, эквивалентен
Plan::Plan(Plan const &other)
: id(other.id) // there's only one member,
// but other members would be treated the same
{}
.пустое тело, вы можете добавить оператор печати, указывающий, что вызывается конструктор копирования, но он не будет водонепроницаемым;в некоторых случаях C ++ может выполнять оптимизацию copy elision , что означает, что фактическое копирование пропускается.