Вызов конструктора внутри конструктора шаблонного класса - PullRequest
0 голосов
/ 10 октября 2018

Этот код имеет шаблонный класс.Конструктор по умолчанию вызывает себя рекурсивно.Как это может сделать это?Я не понимаю этот код.Может быть, если бы мне дали пример без шаблонов, просто с типами POD, все было бы яснее.Я не сталкивался с этой конструкцией ранее в программировании на C ++.Я думаю, что я не понимаю ни конструктора, ни шаблонов.

template <typename T>
class Simple {
  public:
    Simple(T value = T());    // What's this?
    T value();
    void set_value(T value);
  private:
    T value_;
};

template<typename T>
Simple<T>::Simple(T value) {
  value_ = value;
}

template<typename T>
T Simple<T>::value() {
  return value_;
}

template<typename T>
void Simple<T>::set_value(T value) {
  value_ = value;
}

Мой вопрос: что делает T value = T()?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Класс Simple имеет переменную value типа T (Templated).

Указанный вами конструктор является конструктором по умолчанию.Если при создании объекта Simple параметр не указан.Тогда конструктор по умолчанию будет создавать экземпляр объекта значения в конструкторе по умолчанию T.

Либо, Simple(T value = T()) является конструктором по умолчанию, который создает значение для конструктора по умолчанию типизированного элемента.

Пример: -если T - String.

Simple (String value = String()) 

, поэтому значение теперь инициализируется по умолчанию для String ().

0 голосов
/ 10 октября 2018

Это просто значение по умолчанию, как void foo(int i = 42);, рекурсия отсутствует.

foo(); эквивалентно foo(42);.

Таким же образом, с Simple(T value = T());

Simple<int> s{}; будет эквивалентно Simple<int> s{0};, а Simple<std::string> s{}; будет эквивалентно Simple<std::string> s{std::string{}}; (пустая строка).

T() вызовет конструктор по умолчанию для данного T (int и std::string в моих примерах).

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