вопрос об определениях классов - PullRequest
1 голос
/ 08 марта 2011

Я видел, что следующие два определения классов претендуют на эквивалентность. Это правда? Как? Спасибо.

class  complex{
double re, im;
public:
  complex( ): re(0) , im(0) { }
  complex (double  r): re(r), im(0)  { }
  complex (double  r, double i): re(r),   im(i) { }
};
class  complex{
  double re, im;
  public:
    complex (double  r=0, double i=0): re(r),   im(i) { }
};

Ответы [ 5 ]

3 голосов
/ 08 марта 2011

Первая перечисляет все возможности (без параметра, один параметр, два параметра) отдельно ( перегрузка ), вторая требует только одну функцию из-за использования параметров по умолчанию , что точно так же, но намного короче.

Первый вариант по-прежнему полезен, если инициализация переменных - это больше, чем просто присвоение им значения или вы хотите иметь совершенно разные конструкторы в зависимости от количества параметров.

1 голос
/ 08 марта 2011

Строго говоря, они не эквивалентны (в конце концов, у второго есть только один конструктор, а у первого три), но они ведут себя одинаково.Конструктор с ненулевыми аргументами, предоставляющими значения по умолчанию для всех из них, квалифицируется как конструктор по умолчанию.

0 голосов
/ 08 марта 2011

Значения по умолчанию (r = 0) в последнем примере позволяют частично или полностью пропускать аргументы.Таким образом, один метод конструктора содержит все три варианта из верхнего примера.

0 голосов
/ 08 марта 2011
class  complex{
  double re, im;
  public:
    complex (double  r=0, double i=0): re(r),   im(i) { }
};

Это упрощенный способ реализации первой версии.Это в основном охватывает все случаи трех конструкторов в первом.

0 голосов
/ 08 марта 2011

Да. Они эквивалентны. Но второй, на мой взгляд, лучше, так как он компактен, в нем используется одна функция C ++, называемая аргумент по умолчанию .

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