Sun Studio 12: C++ ユーザーズガイド

15.6 混合演算

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 型に変換されます。b+i の計算結果を double 型の y で割っているので、y もまた complex 型に変換され、複素数除算演算が使用されます。商もまた complex 型ですので、複素数の正弦関数が呼び出され、その結果も complex 型になります。 次も同様です。

ただし、すべての算術演算と型変換が暗黙に行われるわけではありませんし、定義されていないものもあります。たとえば、複素数は数学的な意味での大小関係が決められないので、比較は等しいか否かの判定しかできません。


complex a, b;
a == b; // OK
a != b; // OK
a <  b; // エラー: 演算子 < は complex 型に使用できない
a >= b; // エラー: 演算子 >= は complex 型に使用できない

同様に、complex 型からそれ以外の型への変換もはっきりした定義ができないので、そのような自動変換は行われません。変換するときは、実部または虚部を取り出すのか、または絶対値を取り出すのかを指定する必要があります。


complex a;
double f(double);
f(abs(a)); // OK
f(a);      // エラー: f(complex) は、引数の型が一致していない