2011-01-18 2 views
2

В пункте 15 из 3-го издания Effective C++ шрифт класса RAII содержит в качестве своего ресурса FontHandle. Элемент показывает, как класс Font может предложить неявную функцию преобразования его FontHandle таким образом:Отброшено синтаксисом функтора в Эффективном C++

operator FontHandle() const 
    {return f;} 

В чем разница между этим кодом и:

FontHandle operator()() const 
    {return f;} 

Если нет разницы, является его необычный и не часто используемый синтаксис?

ответ

7

Первый, 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() зависели от обстоятельств.

5

Первый обеспечивает неявное преобразование, так что вы можете написать

FontHandle h = myFont; 

, а также (чтобы быть четко о том, что происходит)

FontHandle h = (FontHandle)myFont; 

Секундная перегружает оператор вызова функции (), чтобы вы можете написать реквизиты

FontHandle h = myFont(); 

Почему бы не то cond, я не уверен. У меня есть только эффективный C++, поэтому я не могу проверить, что говорит об этом Meyers.

+4

С моей точки зрения, первый синтаксис также допускает неявное преобразование без явного приведения. –

+0

У моей головы, похоже, такой же верх, как у вас. Я отредактировал его перед тем, как прочитать ваш комментарий. – Thomas

+2

'FontHandle h = (FontHandle) myFont;' это явное преобразование (с помощью C-стиля). Элементы 'operator X()' позволяют вам делать неявные преобразования для типа X (и сделать код, который использует его немного более запутанным в процессе). –

Смежные вопросы