Operator()ってなんぞ?
プログラマであればC++コードを読み進める中で何度も登場するOperatorという文字。ヘッダファイルのクラスにメソッド関数内でよく見かけるがどのような処理をしているか気にしたことがなかった。気にしないということはつまり使用するべき場面に遭遇しなかったのだ。しかし、Coverity解析を回している中でautosar規約に準拠したコード記述が必要となったため、今回operator()について理解を深めていこうと思う。
まず初めにやることとしてはいつものことながらchatgpt先生にoperatorってなに?と聞いてみる。返答がこちらです。
operator ()」は、関数呼び出し演算子をオーバーロードしたもので、クラスや構造体において関数のようにオブジェクトを呼び出すことを可能にする機能です。
まあ日本語ですので読めはしますが理解までにはこの文章をひとつずつ分解していく。
1.関数呼び出し演算子・・・これは関数の()呼び出しに使用する引数のことを指している。これをオーバロードしたもの。。
オーバロード忘れてる。。再度定義を確認。
1.オーバロード・・・同じ名前の関数や演算子に対して異なる処理を定義することを意味します。
ふむふむつまり()を自分のもののように動作できるということか。これをクラスで宣言しておくとクラスを関数のように呼ぶことができるということか
とはいってもいまいち使い方はわかっていないのでいざ具体的な例で考えていく。operator()の使い方はまずクラス内でメンバ関数として定義する必要があるみたい。
とりあえずコード例を書いてみます。
hpp
include<iostream>
class Car{ public: static void move(string x ){
};
static void operator()(string x)
std ::cout << "こんにちは" << x << endl;
};
cpp
int main(){
Car yaris;
yaris.move("Ken")
//オブジェクトを関数のように呼び出す
yaris("Ken");
}
Carクラスでoperatorを使用していない関数moveとoperatorを使用する関数を記述してみました。メソッドを呼び出す方法と比較した時operator()によりクラスオブジェクトをオーバロードし関数のように使用できていることがわかると思います。つまりオブジェクト指向的なアプローチを取りながら関数のように記述できコードの可読性を高めることができるのがoperatorということですね!すっきりしたのでそれでは!