Первый, operator FontHandle
, является оператором преобразования. Это позволяет экземпляр этого типа класса, чтобы быть неявно преобразован в FontHandle
объект, так что вы могли бы написать:
Font myFont;
FontHandle handle = myFont;
Чаще операторы преобразования используется, чтобы позволить вам использовать объект одного типа, как если бы это было другой тип выражения. Например,
void f(FontHandle fh);
Font myFont;
f(myFont); // converts myFont to a FontHandle via the conversion operator
Во-вторых, operator()
, перегрузка оператора вызова функции. Это позволяет экземпляру типа вашего класса, которые будут использоваться, как если бы это была функция не принимает никаких аргументов:
Font myFont;
myFont();
Неявные операторы преобразования являются менее распространенными, чем operator()
перегрузками (или они должны быть менее распространены). Во многих случаях они могут быть очень подвержены ошибкам, потому что у вас нет контроля над тем, когда используется оператор (в C++ 0x вы сможете сделать операторы преобразования explicit
, чтобы убедиться, что они используются только в нескольких особых обстоятельствах). Однако, если вы хотите, чтобы оператор преобразования или перегрузка operator()
зависели от обстоятельств.
С моей точки зрения, первый синтаксис также допускает неявное преобразование без явного приведения. –
У моей головы, похоже, такой же верх, как у вас. Я отредактировал его перед тем, как прочитать ваш комментарий. – Thomas
'FontHandle h = (FontHandle) myFont;' это явное преобразование (с помощью C-стиля). Элементы 'operator X()' позволяют вам делать неявные преобразования для типа X (и сделать код, который использует его немного более запутанным в процессе). –