[Work/Class/C++11の場合/CPPBasic]

C++11の場合 - 演算子のオーバーロード

演算子のオーバーロードの目的とできること

クラスを定義するようになってくると「インスタンス同士の(内部のパラメータの)足し算」がしたい,というような要求が生まれてくる.

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;
}