Передача параметров конструкторам без параметров - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь понять, что делает программа, которую я использую. Ниже я включил соответствующие фрагменты кода.

Создается указатель класса StAnaPars:

StAnaPars* anapars12 = new StAnaPars;

Программа обращается к нескольким членам anapars12 для установки различных параметров анализа.

Затем создается другой указатель класса StAnaPars следующим образом:

StAnaPars *anapars12_toward = new StAnaPars(*anapars12);

Определение конструктора для класса StAnaPars это:

   23 class StAnaPars : public TObject {
   24 public:
   25   StAnaPars()
   26     : mCorrectTowerEnergyForTracks(new StjTowerEnergyCorrectionForTracksNull)
   27     , useTpc(false)
   28     , useBemc(false)
   29     , useEemc(false)
   30     , useFms(false)
   31     , useMonteCarlo(false)
   32     , randomSelectorProb(1.0)
   33     , randomSelectorAt(false)
   34     , randomSelectorSeed(0)
   35     , changeTracks(0)
   36     , changeTowers(0)
   37   {
   38   }

Мой вопрос: когда создается второй StAnaPars указатель, anapars12_toward, мы устанавливаем его равным new StAnaPars(*anapars12), но конструктор StAnaPars этого не делает. t принять любой параметр. Итак, это в основном делает копию anapars12, а теперь anapars12_toward = anapars12? Значит, оба указателя имеют одинаковую информацию? Но как это сделать, если конструктор StAnaPars не принимает никаких параметров?

Большое спасибо за помощь!

1 Ответ

4 голосов
/ 05 августа 2020

Этот код использует конструктор копирования.

Конструктор копирования - это конструктор, объявленный как T(const T& other). Он может быть определен пользователем или, если пользовательский конструктор копирования не существует, он неявно определен и выполняет поэлементное копирование.

Если вы хотите явно запретить копирование, вы можете объявить конструктор копирования как:

T(const T&) = delete;

То же самое верно и для присваивания копии - T& operator=(const T& other) (это также неявно определено).

На самом деле есть некоторые не -тривиальные правила о том, когда именно неявный конструктор копирования на самом деле определен . Иногда неявно объявляется удаленным. (например, если у типа есть члены без конструктора копирования). Краткое изложение правил можно найти здесь: https://en.cppreference.com/w/cpp/language/copy_constructor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...