4
class Complex
{
private:
double real;
double imag;

public:
// Default constructor
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}

// A method to compare to Complex numbers
bool operator == (Complex rhs) {
   return (real == rhs.real && imag == rhs.imag)? true : false;
}
};

int main()
{
// a Complex object
Complex com1(3.0, 0.0);

if (com1 == 3.0)
   cout << "Same";
else
   cout << "Not Same";
 return 0;
}

出力:同じ

このコードがSameとして出力する理由、ここでの変換コンストラクターの動作について説明してください。よろしくお願いします。

4

2 に答える 2

11

変換コンストラクターは、explicit1つの引数で呼び出すことができる非コンストラクターです。コードサンプルでは、Complex​​コンストラクターがパラメーターのデフォルト値を提供するため、単一の引数(たとえば3.0)で呼び出すことができます。そして、そのようなコンストラクターはマークされていないのでexplicit、それは有効な変換コンストラクターです。

との間com1 == 3.0にがない場合、変換コンストラクターが呼び出されます。したがって、コードはこれと同等です。operator ==Complexdouble

if( com1 == Complex(3.0) )
于 2012-06-05T22:29:34.953 に答える
1

あなたの例では、コンパイラはオブジェクト==で使用されている演算子complexを確認し、それを機能させる方法を見つけようとします。たった1つでoperator==complex引数が必要です。complexdoubleを取り、マークされていないコンストラクターがあるため、explicitそれを使用して一時complexオブジェクトを生成し、それをに渡しoperator==ます。

于 2012-06-05T22:33:53.923 に答える