演算子のオーバーロードの目的とできること
クラスを定義するようになってくると「インスタンス同士の(内部のパラメータの)足し算」がしたい,というような要求が生まれてくる.
Javaというか以前からあるオブジェクト指向プログラミング言語では,このような要求に対しては「そのクラスの静的メソッドとして,インスタンスを2つとるaddという関数を作り,そこでインスタンス同士の足し算定義する」という手法が取られる.
それに対してC++11では,クラス内部で「+
」という加算演算子そのものを再定義する能力を持っており,任意の定義でインスタンス同士の足し算を実装することができる.もちろん他の演算子も定義することができる.
演算子のオーバーロードの方法は関数の定義と同じく,ヘッダファイルのクラス定義の中で「operator
」キーワードをつけた演算子を関数名として定義しておいて,ソースファイルの方で定義する.
// AddableBall.hpp
#ifndef ADDABLE_BALL_HPP
#define ADDABLE_BALL_HPP
#include <stdio.h>
#include <stdlib.h>
class AddableBall{
public:
// デフォルトコンストラクタ
AddableBall();
// 引数付きコンストラクタ
AddableBall(int windowWidth, int windowHeight);
// デストラクタ
~AddableBall();
// テストのために出力するインスタンス関数
void printPosition();
// 「+」演算子のオーバーロード
AddableBall operator+(AddableBall otherOne);
private:
int windowWidth, windowHeight;
int xPos, yPos;
};
#endif //ADDABLE_BALL_HPP
// AddableBall.cpp
#include "AddableBall.hpp"
#include <stdio.h>
#include <stdlib.h>
AddableBall::AddableBall(){
AddableBall(640, 480);
}
AddableBall::AddableBall(int width, int height){
windowWidth = width;
windowHeight = height;
xPos = (int)((float)rand() / (float)RAND_MAX * windowWidth);
yPos = (int)((float)rand() / (float)RAND_MAX * windowHeight);
}
AddableBall::~AddableBall(){
}
void AddableBall::printPosition(){
printf("%d, %d\n", xPos, yPos);
}
// 「+」演算子のオーバーロード
AddableBall AddableBall::operator+(AddableBall otherOne){
// 新しいインスタンスを作って
AddableBall addedBall(640, 480);
// xPosとyPosを足して
addedBall.xPos = xPos + otherOne.xPos;
addedBall.yPos = yPos + otherOne.yPos;
// 返す
return addedBall;
}
int main(){
// テスト用のmain関数
AddableBall firstBall(640, 480);
AddableBall secondBall(640, 480);
printf("First Ball Parameter: ");
firstBall.printPosition();
printf("Second Ball Parameter: ");
secondBall.printPosition();
AddableBall thirdBall = firstBall + secondBall;
printf("Third Ball Parameter After Operation: ");
thirdBall.printPosition();
return 0;
}