変換演算子とコンストラクタについてのここでのいくつかの質問を読んで、私はそれらの間の相互作用、つまり「あいまいな」呼び出しがあると考えました。次のコードを考えてみましょう:変換コンストラクタと変換演算子:precedence
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
上記のコードが表示され、コンストラクタとは対照的に、変換演算子が呼び出されることを意味し、「Aの変換演算子と呼ばれます」。 operator B()
コードをA
から削除/コメントアウトすると、コンパイラは代わりにコンストラクタを使用して(コードを変更しなくても)うれしいことになります。
私の質問は以下のとおりです。
- コンパイラは
B b = A();
があいまいな呼び出しであることを考慮していないので、ここでの仕事での優先順位のいくつかの種類が存在しなければなりません。この優先順位は正確にどこに設定されていますか? (C++標準の参照/引用は高く評価されます) - オブジェクト指向の哲学的見地からは、これがコードの振る舞いと同じですか?
A
オブジェクトがB
オブジェクト(A
またはB
)になる方法についてもっと知っているのは誰ですか? C++によれば、答えはA
です。オブジェクト指向の練習には、これがそうでなければならないことが示唆されています。個人的にはどちらにしても意味がありますので、どのように選択したのか知りたいです。
あなたは初期設定をコピーしてやる、と変換シーケンスで変換を行うと考えられる候補関数は変換関数と変換するコンストラクタです事前
"//コピーコンストラクタ"はコピーコンストラクタではなく、コンストラクタです。 –
あなたが正しいです、私はその言葉を誤解しました。私はそれを編集しました。 – GRB