Что касается вашего варианта использования, вот что вызывает каждая строка:
Geometry geometry(0.3, 32, 0.0, 0.0, "SPHERE", true); // Geometry constructor 2
Container cont("Sphere", "SPHERE", geometry); // Container constructor 2, Geometry constructors 3 & 1
Здесь конструктор для Geometry
на самом деле называется за пределами конструктор Container
.Но конструкторы геометрии 3 и 1 также называются ... почему?
Почему так и есть.Поскольку конструктор для Container
принимает параметр Geometry
по значению, переданный объект geometry
будет скопирован (следовательно, вызывается конструктор копирования).Затем в конструкторе Container
фактически вызывается конструктор Geometry 1, также известный как конструктор по умолчанию .После этого вызывается функция копирования-присваивания, другой неявно генерируемый специальный метод:
Container::Container(std::string strName, std::string strType, Geometry geometry)
/*: stdstrContainerName()
, stdstrPluginType()
, Geom()*/ // default-constructors implicitly called as member-initialisation
{
stdstrContainerName = stdstrContainerName;
stdstrPluginType = stdstrPluginType;
Geom = geometry; // copy-assignment, i.e. operator= (Geometry const&)
}
Чтобы переопределить поведение по умолчанию, явно используйте инициализация члена :
Container::Container(std::string strName, std::string strType, Geometry geometry)
: stdstrContainerName(strName)
, stdstrPluginType(strType)
, Geom(geometry) // copy-constructor, i.e. Geometry(Geometry const&)
{
}
Это должно привести к конструктору 3, так как теперь вызывается конструктор копирования.
Демо
При переключении на инициализацию члена вы могли заметить, что конструктор 3 вызывается дважды.Опять же, это связано с тем, что конструктор Контейнера принимает свой параметр geometry
значением , создавая новый объект посредством конструирования копии.Чтобы предотвратить создание копии и сделать конструктор более эффективным, мы можем передать geometry
по ссылке.Кроме того, мы можем установить параметр, чтобы гарантировать, что ссылка не будет изменена в конструкторе.
Таким образом, конструктор Container
можно изменить на:
Container(const std::string &strName, const std::string &strType, const Geometry &geometry);