C++オーバーロード完全マスター:関数と演算子のオーバーロード
C++では、同じスコープ内で 関数 名または 演算子 に複数の定義を指定できます。これはそれぞれ 関数オーバーロード と 演算子オーバーロード と呼ばれます。
オーバーロードされた宣言とは、同じスコープ内で以前に宣言された宣言と同じ名前を持ちますが、引数が異なり、明らかに異なる定義(実装)を持つ宣言のことです。
オーバーロードされた 関数 または 演算子 を呼び出すと、コンパイラは関数や演算子の呼び出しに使用した引数の型を、定義内で指定されたパラメータ型と比較することで、最も適切な定義を決定します。最も適切なオーバーロード関数や演算子を選択するこのプロセスを オーバーロード解決 と呼びます。
C++での関数オーバーロード
同じスコープ内で、同じ関数名に複数の定義を持たせることができます。関数の定義は、引数リストの型および/または引数の数によって互いに異なっていなければなりません。戻り値の型のみが異なる関数宣言をオーバーロードすることはできません。
同じ関数 print() を使用して異なるデータ型を出力する例:
Live Demo#include <iostream>
using namespace std;
class printData {
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}
void print(double f) {
cout << "Printing float: " << f << endl;
}
void print(char* c) {
cout << "Printing character: " << c << endl;
}
};
int main(void) {
printData pd;
// 整数を出力
pd.print(5);
// 浮動小数点数を出力
pd.print(500.263);
// 文字列を出力
pd.print("Hello C++");
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
C++での演算子オーバーロード
C++で利用可能なほとんどの組み込み演算子を再定義またはオーバーロードできます。これにより、プログラマーはユーザー定義型でも演算子を使用できるようになります。
オーバーロードされた演算子は特殊な名前を持つ関数です:キーワード "operator" に続けて、定義される演算子の記号を指定します。他の関数と同様に、オーバーロードされた演算子には戻り値の型とパラメータリストがあります。
Box operator+(const Box&);
これは、2つの Box オブジェクトを 加算 して最終的な Box オブジェクトを返す加算演算子を宣言します。ほとんどのオーバーロード演算子は、通常の非メンバ関数またはクラスメンバ関数として定義できます。上記関数をクラスの非メンバ関数として定義する場合、各オペランドに対して2つの引数を渡す必要があります:
Box operator+(const Box&, const Box&);
メンバ関数を使用した演算子オーバーロードの概念を示す例です。ここでは、プロパティにアクセスするためのオブジェクトが引数として渡され、この演算子を呼び出すオブジェクトは this ポインタでアクセスできます:
Live Demo#include <iostream>
using namespace std;
class Box {
public:
double getVolume(void) {
return length * breadth * height;
}
void setLength( double len ) { length = len; }
void setBreadth( double bre ) { breadth = bre; }
void setHeight( double hei ) { height = hei; }
// +演算子をオーバーロードして2つのBoxオブジェクトを加算
Box operator+(const Box& b) {
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
private:
double length; // 箱の長さ
double breadth; // 箱の幅
double height; // 箱の高さ
};
// プログラムのメイン関数
int main() {
Box Box1; // Box1をBox型で宣言
Box Box2; // Box2をBox型で宣言
Box Box3; // Box3をBox型で宣言
double volume = 0.0; // 箱の体積を格納
// 箱1の仕様
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// 箱2の仕様
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// 箱1の体積
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume << endl;
// 箱2の体積
volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume << endl;
// 2つのオブジェクトを加算
Box3 = Box1 + Box2;
// 箱3の体積
volume = Box3.getVolume();
cout << "Volume of Box3 : " << volume << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
オーバーロード可能/不可能な演算子
オーバーロード可能な演算子のリスト:
| + | - | * | / | % | ^ |
| & | | | ~ | ! | , | = |
| < | > | <= | >= | ++ | -- |
| << | >> | == | != | && | || |
| += | -= | /= | %= | ^= | &= |
| |= | *= | <<= | >>= | [] | () |
| -> | ->* | new | new [] | delete | delete [] |
オーバーロード できない 演算子のリスト:
| :: | .* | . | ?: |
演算子オーバーロードの例
概念理解に役立つさまざまな演算子オーバーロード例:
| No. | 演算子と例 |
|---|---|
| 1 | 単項演算子のオーバーロード |
| 2 | 二項演算子のオーバーロード |
| 3 | 関係演算子のオーバーロード |
| 4 | 入出力演算子のオーバーロード |
| 5 | ++ と -- 演算子のオーバーロード |
| 6 | 代入演算子のオーバーロード |
| 7 | 関数呼び出し () 演算子のオーバーロード |
| 8 | 添字 [] 演算子のオーバーロード |
| 9 | クラスメンバアクセス演算子 -> のオーバーロード |
C言語
- C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++メモリ管理の極意:newとdeleteのエキスパート活用法
- C++ public/protected/private継承の違いを徹底解説
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C言語 構造体: 関数への渡し方・返し方・参照渡しをマスター
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C++演算子オーバーロード:コード例付き実践ガイド
- C++関数を実例で徹底解説:基本から応用まで
- C++日付と時刻の完全ガイド:ctimeライブラリの活用
- Python演算子オーバーロード完全ガイド:__add__、__lt__など特殊メソッドでOOP設計を強化