complex 型は、組み込みの算術型と混在した式でも使用できるように定義されています。算術型は自動的に complex 型に変換されます。算術演算子とほとんどの数学関数の complex バージョンがあります。次に例を示します。
int i, j; double x, y; complex a, b; a = sin((b+i)/y) + x/j;
b+i という式は混合算術演算です。整数 i は、コンストラクタ complex::complex(double,double=0) によって、complex 型に変換されます。このとき、まず整数から double 型に変換されます。y、double で割られる計算結果です。つまり、y は complex 型へ変換され、複素数除算演算が使用されます。商もまた complex 型ですので、複素数の正弦関数が呼び出され、その結果も complex 型になります。次も同様です。
ただし、すべての算術演算と型変換が暗黙に行われるわけではありませんし、定義されていないものもあります。たとえば、複素数は数学的な意味での大小関係が決められないので、比較は等しいか否かの判定しかできません。
complex a, b; a == b; // OK a != b; // OK a < b; // error: operator < cannot be applied to type complex a >= b; // error: operator >= cannot be applied to type complex
同様に、complex 型からそれ以外の型への変換もはっきりした定義ができないので、そのような自動変換は行われません。変換するときは、実部または虚部を取り出すのか、または絶対値を取り出すのかを指定する必要があります。
complex a; double f(double); f(abs(a)); // OK f(a); // error: no match for f(complex)