printКлассы

printКонструктор-преобразователь

Определение: Конструктор-преобразователь – это конструктор, который можно вызвать с одним аргументом. Конструктор может иметь более одного параметра, но все они должны иметь значения по умолчанию.

Синтаксис:
имя класса(другой тип);
имя класса(const другой тип&);

Задача: Инициализировать все поля, используя для установки начального состояния значение другого типа.

Назначение: Используется для преобразования в определяемый тип значения другого типа. Компилятор может вызывать его самостоятельно, если аргумент функции или операции имеет тип другой тип, а параметр – тип имя класса.

Замечания:
  • Если конструктор с одним аргументом не должен использоваться неявно для преобразования, перед ним нужно написать explicit (явный).

Примеры:
class String {
public:
  String(const char *s=""); // конструктор-преобразователь
  ...
};
void fun(const String &s);
int main()
{
  String a("ABC"); // создание строки, вызывается конструктор
  char s[]="ABCDE";
  fun(s); // перед вызовом функции будет вызван конструктор-преобразователь, 
          // временный объект будет уничтожен после выполнения оператора
  a=s; // OK, будет выполнено неявное преобразование 
       // с созданием временного объекта
  a=String(s); // явный вызов конструктора для создания временного объекта
  a=(String)s; // явный вызов операции преобразования, устаревшая форма 
  a=static_cast<String>(s); // явный вызов операции преобразования, новая форма
}

class Stack {
public:
  explicit Stack(int); // конструктор, требующий явного вызова для преобразования
  ...
};
void fun(Stack x);
int main()
{
  Stack a(100); 
  ...
  fun(100); // ошибка, нет преобразователя int -> Stack
  fun(Stack(100)); // OK
  a=Stack(100); // ОК, явный вызов конструктора
  a=100; // ошибка, нет преобразователя int -> Stack
  a=(Stack)100; // OK, явный вызов операции преобразования, устаревшая форма
  a=static_cast<Stack>(100); // OK, явный вызов операции преобразования, новая форма
}
loading