次のコードは * および & 演算子をオーバーロードするものであることがわかっています。
X& operator*() const
{
return *this;
}
X* operator&() const
{
return this;
}
しかし、次のコードが何を意味するのかわかりませんか?(ビルドはパスできる) Xのポインタを取得するのに使われているようです。
operator X*() const
{
return this;
}
次のコードは * および & 演算子をオーバーロードするものであることがわかっています。
X& operator*() const
{
return *this;
}
X* operator&() const
{
return this;
}
しかし、次のコードが何を意味するのかわかりませんか?(ビルドはパスできる) Xのポインタを取得するのに使われているようです。
operator X*() const
{
return this;
}
operator X*() const
{
return this;
}
Implicit conversion operator
を入力しX*
ます。ユーザー定義の変換です。詳細12.3
については、規格を参照してください。関連するBoostConトークから逆参照演算子をオーバーロードする奇妙な方法
これは、いわゆるユーザー定義の変換(UDC) です。コンストラクターまたは特別な変換関数を使用して、他の型への変換を指定できます。
構文は次のようになります。
operator <some_type_here>();
したがって、特定のケースは type への変換演算子X*
です。
それらをコーディングするときに覚えておくべきことがいくつかあります。
コンパイラは UDC を使用して一度に 1 つのオブジェクトを暗黙的に変換することしかできないため、暗黙的な変換の連鎖は機能しません。
class A
{
int x;
public:
operator int() { return x; };
};
class B
{
A y;
public:
operator A() { return y; };
};
int main ()
{
B obj_b;
int i = obj_b;//will fail, because it requires two implicit conversions: A->B->int
int j = A(obj_b);//will work, because the A->B conversion is explicit, and only B->int is implicit.
}
派生クラスの変換関数は、同じ型に変換しない限り、基本クラスの変換関数を隠しません。
コンストラクターを介して変換する場合は、既定の変換のみを使用できます。例えば:
class A
{
A(){}
A(int){}
}
int main()
{
A obj1 = 15.6;//will work, because float->int is a standart conversion
A obj2 = "Hello world!";//will not work, you'll have to define a cunstructor that takes a string.
}