Что означает этот стиль перегрузки оператора?класс Bar {operator Foo(); }
class Foo {
Foo(int a) { ... }
};
class Bar {
operator Foo() { return Foo(25); }
};
Что означает этот стиль перегрузки оператора?класс Bar {operator Foo(); }
class Foo {
Foo(int a) { ... }
};
class Bar {
operator Foo() { return Foo(25); }
};
То есть определенные пользователем функции преобразования, которая преобразует экземпляр Bar
в Foo
неявно.
Bar bar;
Foo foo = bar; // bar implicitly converts into Foo.
Это как если бы вы написали это:
Foo foo = Foo(25);
Если у Вас есть такая функция преобразования, то вы можете назвать это:
void f(Foo foo); //a function which accepts Foo
f(bar); // bar implicitly converts into Foo.
Так, например неявный преобразование может быть нежелательным в какой-то момент, поскольку это может вызвать проблемы, создавая непреднамеренный результат. Чтобы избежать этого, вы можете сделать функцию преобразования явно, как (в C++ 11 только):
//valid in C++11 only
class Bar {
explicit operator Foo() { return Foo(25); }
};
Теперь оба они дали бы ошибка:
Foo foo = bar; //error
f(bar); //error
Однако, следующее разрешено:
Foo foo = static_cast<Foo>(bar); //Ok
f(static_cast<Foo>(bar)); //Ok
Это перегрузка cast operator
. Лучшая документация я смог найти MSDN
В принципе, если у вас есть Bar
вы можете привести его к Foo
, который построен с определенным значением:
Bar b;
Foo f = b;
быстрые пальцы у вас есть :) – Chad
Использование ' Явный' для преобразования операторов введен в C++ 11? AFAIR только конструкторы могут быть явными в C++ 03 или, возможно, я не помню правильно ... –
@Als: Вы правы. В C++ 03 только конструкторы могут быть явными. Я сделал это ясно в своем ответе. – Nawaz