перегруженный оператор приведения или конструктор с одним аргументом - PullRequest
8 голосов
/ 11 августа 2010

Если у класса есть конструктор с одним аргументом, я понимаю, что он неявно преобразуется конструктором в тип аргумента в соответствующих контекстах. Определение оператора преобразования также делает класс конвертируемым в другой тип. Вопросы

  • Оператор преобразования когда-либо вызывается неявно?
  • Если для класса определены как конструктор с одним аргументом, так и оператор преобразования с одним и тем же типом, то имеет ли одно преимущество над другим или оно неоднозначно?
  • Если вы решили, что хотите, чтобы класс был конвертируемым в данный тип, какой подход лучше или вы должны предоставить оба?

Edit:

Я вижу, что не ясно понимал направленность и что эти двое совершают преобразования в противоположных направлениях. Как следует из

  • Если у вас есть контроль над двумя классами, которые вы хотите сделать конвертируемыми друг в друга и между собой, есть ли предпочтительный способ с точки зрения этих двух операций выполнить это?
  • Можно ли пометить оператор преобразования как явный?

Ответы [ 3 ]

7 голосов
/ 11 августа 2010

Это две противоположности: неявный конструктор с одним аргументом позволяет автоматически преобразовывать тип в тип вашего класса из типа аргумента Оператор преобразования позволяет неявно приводить из вашего типа класса.

Общая мудрость заключается в том, чтобы избегать того и другого, если в этом нет особой необходимости.

3 голосов
/ 11 августа 2010

Нет, если класс имеет конструктор с одним аргументом, он неявно конвертируется из типа его аргумента.

Что касается других ваших вопросов:

  • Может ли оператор приведения вызываться неявно?

Да, когда это необходимо.

  • Если для класса определены как конструктор с одним аргументом, так и оператор приведения с одним и тем же типом, то имеет ли одно преимущество над другим или оно неоднозначно?

Мне не очень понятно, о чем вы спрашиваете, но если преобразование может пойти в любую сторону, это неоднозначно.

  • Если вы решили, что хотите, чтобы класс был конвертируемым в данный тип, какой подход лучше или вы должны предоставить оба?

Вы должны использовать приведение - конструкторы этого не делают.

В общем, если вы не хотите автоматических преобразований из класса в другие типы (и в большинстве случаев это не так), лучше предоставить именованные функции преобразования (ToString, ToInt, ToX), которые никогда не будут вызываться автоматически компилятором.

, который приводит к вашим двум другим вопросам:

  • Если у вас есть контроль над двумя классами, которые вы хотите сделать конвертируемыми друг в друга и друг от друга, есть ли предпочтительный способ с точки зрения этих двух операций выполнить это?

Да, использовал именованную функцию для выполнения хотя бы одного из преобразований. std :: string делает это - есть преобразование из char * в строку с использованием конструктора, но другим способом вам нужно использовать именованную функцию c_str ().

  • Можно ли пометить оператор преобразования как явный?

К сожалению, нет.

2 голосов
/ 11 августа 2010

если у вас есть контроль над двумя классами, которые вы хотите сделать конвертируемыми друг в друга и друг от друга, есть ли предпочтительный способ с точки зрения этих двух операций выполнить это?

Я бы написал один аргумент, явный конструктор.

Я видел слишком много действительно неприятных сюрпризов, когда допускал неявные преобразования, поэтому я всегда запрещаю их. Написание f(A(b)) не намного сложнее, чем написание f(b), и дает компилятору гораздо больше шансов выдавать значимые сообщения об ошибках, когда правильное значение f() находится вне области действия.

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