2011-12-30 2 views

ответ

10

То есть определенные пользователем функции преобразования, которая преобразует экземпляр 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 
+3

быстрые пальцы у вас есть :) – Chad

+0

Использование ' Явный' для преобразования операторов введен в C++ 11? AFAIR только конструкторы могут быть явными в C++ 03 или, возможно, я не помню правильно ... –

+0

@Als: Вы правы. В C++ 03 только конструкторы могут быть явными. Я сделал это ясно в своем ответе. – Nawaz

0

Это перегрузка cast operator. Лучшая документация я смог найти MSDN

В принципе, если у вас есть Bar вы можете привести его к Foo, который построен с определенным значением:

Bar b; 
Foo f = b; 
Смежные вопросы