13

このコードを作成しましょう:

Test1 t1;
Test2 t2;
t1 = t2;

実装方法は3つ(またはそれ以上?)あると思いますt1 = t2

  • 代入演算子をオーバーロードするにはTest1
  • 型キャスト演算子をオーバーロードするにはTest2
  • Test1(const Test2&)変換コンストラクターを作成するには

私のGCCテストによると、これは使用されるものの優先順位です。

  1. 演算子の割り当て
  2. 変換コンストラクターと型キャスト演算子(あいまい)
  3. const変換コンストラクターとconst型キャスト演算子(あいまい)

この優先順位の理由を理解するのを手伝ってください。

私はこのコードをテストに使用します(試してみるためにいくつかの行のコメントを外してください)

struct Test2;
struct Test1 {
  Test1() { }
  Test1(const Test2& t) { puts("const constructor wins"); }
//  Test1(Test2& t) { puts("constructor wins"); }
//  Test1& operator=(Test2& t) { puts("assign wins"); }
};

struct Test2 {
  Test2() { }
//  operator Test1() const { puts("const cast wins"); return Test1(); }
//  operator Test1() { puts("cast wins"); return Test1(); }
};


int main() {
  Test1 t1;
  Test2 t2;
  t1 = t2;
  return 0;
}
4

2 に答える 2

15

このステートメントt1 = t2;は、次と同等です。

t1.operator=(t2);

これで、過負荷解決の通常のルールが適用されます。直接一致する場合は、それが選択されます。そうでない場合は、暗黙の変換が(自動的に生成された「暗黙的に定義された」)コピー代入演算子での使用が検討されます。

2つの可能な暗黙のユーザー定義の変換があります。すべてのユーザー定義の変換は等しくカウントされ、両方が定義されている場合、過負荷はあいまいです。

  • 変換コンストラクターt2Test1介してに変換します。Test1::Test1(Test2 const &)

  • キャスト演算子を介してに変換t2します。Test1Test2::operator Test1() const

于 2012-09-09T00:59:01.987 に答える
0

次のコードを使用すると、キャスト演算子ではなくコンストラクターに優先順位が最初に与えられます

 #include<iostream>
 using namespace std;
 class C1;
 class C2
 {
      int x;
 public:
     operator C2()
     {
       C2 temp;
       cout<<"operator function called"<<endl;
       return temp;
    }
 };
class C1
{
   int x;
public:
   C1():x(10){}
   C1(C2)
  {
    cout<<"constructor called"<<endl;
  }
};
 int main()
{
  C1 obj1;
  C2 obj2;
  obj1=obj2;
}

と呼ばれる出力コンストラクタ

于 2018-04-13T18:36:45.747 に答える