#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
toCentimeters
— не самый удачный пример, потому что можно было бы добавить конструктор toCentimeters
. Лучшим примером может быть преобразование вstd::pair
илиstd::string
, где вы не можете добавлять новые конструкторы.