0

重複の可能性:
「オペレーター T*(void)」とは何ですか?いつ呼び出されますか?

次のコードは * および & 演算子をオーバーロードするものであることがわかっています。

X& operator*() const
{
    return *this;
}

X* operator&() const
{
    return this;
}

しかし、次のコードが何を意味するのかわかりませんか?(ビルドはパスできる) Xのポインタを取得するのに使われているようです。

operator X*() const
{
    return this;
}
4

2 に答える 2

1
operator X*() const
{
    return this;
}

Implicit conversion operatorを入力しX*ます。ユーザー定義の変換です。詳細12.3については、規格を参照してください。関連するBoostConトークから逆参照演算子をオーバーロードする奇妙な方法

于 2012-09-19T05:53:13.000 に答える
1

これは、いわゆるユーザー定義の変換(UDC) です。コンストラクターまたは特別な変換関数を使用して、他の型への変換を指定できます。

構文は次のようになります。

operator <some_type_here>();

したがって、特定のケースは type への変換演算子X*です。

それらをコーディングするときに覚えておくべきことがいくつかあります。

  • UDC はあいまいであってはなりません。あいまいでないと呼び出されません。
  • コンパイラは 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.
    }
    

追加情報については、こちらこちら、またはこちらをご覧ください。

于 2012-09-19T06:10:16.830 に答える