как работает оператор типа «operator class ()»

#c

#c

Вопрос:

Я пытаюсь понять, как работает такой оператор: я ничего не нашел об этом в Интернете… Используется ли он как преобразование между типами? Зачем мне нужен оператор = (в строке a = b) вместо b ? Какие еще у него есть применения? Спасибо

 class A{
   int a;
}; 

class B{
   int b;
   operator A() { return A(); }
};

int main(){
   A a;
   B b;
   a = b;
   return 0; 

}
 

Комментарии:

1. en.cppreference.com/w/cpp/language/cast_operator может быть, это только начало.

Ответ №1:

То, на что вы смотрите, — это определяемый пользователем оператор преобразования. Например, у него есть множество применений. Рассмотрим интеллектуальный указатель:

 class SmartPointer {
    // Constructor destructor, operator* and amp; etc ..
}
 

Если бы это был необработанный указатель, мы могли бы проверить, nullptr так ли это:

 if (ptr) {
    ptr->do_something();
}
 

Итак, как мы можем добиться того же с помощью умного указателя? Мы можем определить operator bool .

Другим примером может быть что-то вроде класса units:

 class Meters {
    ...
}
 

Что, если мы хотим быть в состоянии достичь этого:

 void some_operation(double meters);
Meters m{10};
some_operation(m);
 

Ну, мы можем определить оператор преобразования:

 Meters::operator double() {
    return _meters;
}
 

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

Комментарии:

1. Meters to Centimeters — не самый удачный пример, потому что можно было бы добавить конструктор to Centimeters . Лучшим примером может быть преобразование в std::pair или std::string , где вы не можете добавлять новые конструкторы.