2011-12-30 8 views
2

このスタイルの演算子オーバーロードは何を意味しますか?クラス{演算子Foo(); }

Foo暗黙に Barのインスタンスを変換するユーザ定義の変換関数である
class Foo { 
    Foo(int a) { ... } 
}; 

class Bar { 
    operator Foo() { return Foo(25); } 
}; 

答えて

10

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;