C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の変換演算子とは?基本の仕組みとサンプルコードを解説

この記事では、C++における変換演算子(conversion operator)について解説します。C++はオブジェクト指向設計をサポートしているため、現実世界のオブジェクトを具体的な型(クラス)として表現できます。

しかし、開発を進めていると、ある具体的な型のオブジェクトを別の型のオブジェクトや、int・doubleといったプリミティブなデータ型へ変換したい場面に遭遇することがあります。このような変換を実現するために使われるのが変換演算子です。変換演算子は、クラス内に演算子オーバーロード関数と同じ形式で定義します。

ここでは、複素数を表すクラスを例に取り上げます。このクラスは実部(real)と虚部(imag)の2つのメンバ変数を持ちます。このクラスのオブジェクトをdouble型のデータとして扱うと、変換演算子によって複素数の絶対値(magnitude)へと変換されます。

サンプルコード

#include <iostream>
#include <cmath>
using namespace std;

class My_Complex {
   private:
      double real, imag;
   public:
      My_Complex(double re = 0.0, double img = 0.0) : real(re), imag(img) {} // デフォルトコンストラクタ
      double mag() {    // 絶対値を取得する通常のメンバ関数
         return getMagnitude();
      }
      operator double() { // 絶対値を返す変換演算子
         return getMagnitude();
      }
   private:
      double getMagnitude() { // 複素数の絶対値を計算する
         return sqrt(real * real + imag * imag);
      }
};

int main() {
   My_Complex complex(10.0, 6.0);
   cout << "通常の関数による絶対値: " << complex.mag() << endl;
   cout << "変換演算子による絶対値: " << complex << endl;
}

実行結果

通常の関数による絶対値: 11.6619
変換演算子による絶対値: 11.6619

コードのポイント

operator double() の部分が変換演算子です。戻り値の型名を演算子名として記述するだけで、その型への暗黙的な変換が可能になります。この例では、My_Complexオブジェクトがdouble型が必要な文脈(coutへの出力など)で使われると、自動的にgetMagnitude()の結果へと変換されます。

なお、C++11以降では変換演算子にexplicitキーワードを付けることで、意図しない暗黙的な変換を防ぎ、static_cast<double>(obj) といった明示的な変換の場合にのみ変換を許可できます。暗黙変換による予期しない動作を避けたい場合は、explicitの活用を検討するとよいでしょう。

  1. C++の関係演算子とは?種類と使い方を実例付きで解説

    C++プログラミングでは、2つの変数に格納された値を比較し、両者の大小関係や等価性を判定するために関係演算子を使用します。関係演算子は、if文などの条件分岐やfor文・while文などのループ処理において不可欠な要素であり、比較の結果はbool型(true / false)として返されます。C++で利用できる主な関係演算子は以下の通りです。演算子説明>より大きい(左辺が右辺より大きいか)>=以上(左辺が右辺以上か)<より小さい(左辺が右辺より小さいか)<=以下(左辺が右辺以下か)==等しい(左右の値が等しいか)!=等しくない(左右の値が異なるか)関係演算子の使い方これら

  2. C++の算術演算子入門!基本の5つの演算子と複合代入演算子の使い方

    C++の基本的な算術演算子 C++には、数値計算のために用意された基本的な算術演算子が5つあります。それぞれ以下の通りです。 加算(+) 減算(-) 乗算(*) 除算(/) 剰余(%) 使用例 これらの演算子は、C++のあらゆる算術演算に使用できます。実際にどのように動作するのか、以下のサンプルコードで確認してみましょう。 #include <iostream> using namespace std; int main() { int a = 21; int b = 10; int c; c = a + b; cout <&l