ファンター!機能しない


これは、聞くことに怖い音が聞こえる一度は、内部の意味を理解し、そのアイスケーキとして簡単です.
簡単な言葉で、そのオーバーロードを言う空想的な方法で() 機能家として、または単に'関数としてオブジェクトを使用する'.あなたはどのような演算子のオーバーロードを知らない場合は、それを介して行く心配しないでください.あなたは既に演算子のオーバーロードを知っている場合はFunctors .

C++における演算子過負荷


このコンセプトを使用して2つのオブジェクトを追加することができます2つの数字を追加するように.単に定義済みのオブジェクトではなく、ユーザー定義のオブジェクトで動作するように演算子をオーバーロードするだけです.
int a=5,b=3,c=a+b;
myObject objA(10);
myObject objB(20);
myObject objC=objA+objB;
ここでは、2つの整数をCに追加すると、2つのオブジェクト値を追加し、Objectに格納します.上記のコードを直接コンパイルすると、2つのオブジェクトを直接追加できないため、エラーが発生します.これは+演算子オーバーロードの概念を使用してそのような操作を実現します.これは以下の構文として演算子関数を書くことによって行われます
return_type operator op(parameters){
    statements;
    ....
}
op することができます任意の演算子をオーバーロードしたい.例+ , - , * など、オーバーロードできる演算子の例外はほとんどありません.

These are few operators which you cannot overload. . Member access or dot operator,? : Ternary or conditional operator,:: Scope resolution operator,.* Pointer to member operator,sizeof The object size operator,typeid Object type operator.


以下は実装のクラス定義です+ いくつかの追加コードと一緒に演算子のオーバーロード.
class myObject{
    private:
        int _value;
    public:
        myObject(){}
        myObject(int a){
            _value=a;
        }
// +(plus) operator overloading
    myObject operator +(myObject obj){
        myObject temp;
        temp._value=_value+obj._value;
        return temp;
    }

// function to print present value
    void print(){
        cout<<"value: "<<_value<<endl;
    }
};
int main(){
    myObject objA(10);
    myObject objB(20);
    myObject objC=objA+objB; //3rd line in main function
    objC.print(); //prints : value: 30
}
メイン関数の3行目で、MyObjectクラスが何をしているかは、最初にObjectがオーバーロードしようとしていることを検出します+ 演算子を検出した後、Objectの演算子オーバーロード関数へのパラメータとしてObjectを送信します.この関数では、一時的に作成されますtemp 同じクラスのオブジェクトで、現在のオブジェクト値の値を追加することで値を代入します_value による値obj._value .そして、このtempオブジェクトを返します.これはobjcがその値を取得する方法です.
を使用してobjcの値を出力するobjC.print() 関数を出力するvalue: 30 を指定します.
これは、C +で演算子のオーバーロードがどのように行われるかであり、これはユーザー定義のオブジェクトで使用されるときに、特定の演算子に値(または意味)を追加する方法です.
今では、どのような機能家を探索してください.

ファンター


機能家の概念は機能しないが、オブジェクトを機能のように行動させる.
myObject obj(10);
cout<<obj(2); //this will output 20, here you are trying to multiply obj value by 2
2行目、オブジェクトobj 機能のように機能している、これはコンセプトファンによって達成されます.この関数は、オブジェクトobj10 与えられたパラメタ値によって2 返り値20 .
これは過負荷によって達成される() 演算子.以下は、この演算子のオーバーロードを実装するクラス定義です.
class myObject{
    private:
        int _value;
    public:
        myObject(){}
        myObject(int a){
            _value=a;
        }
    int operator ()(int value){
        return _value*value;
    }
};
上記のクラス定義のように、オブジェクトが関数として呼ばれるたびに、オブジェクトの値を返します_value 渡されたパラメータを乗算します.上記の実装の完全なコード
#include <iostream>
using namespace std;

class myObject{
    private:
        int _value;
    public:
        myObject(){}
        myObject(int a){
            _value=a;
        }
    int operator ()(int value){
        return _value*value;
    }
};
int main(){
    myObject obj(10);
    cout<<obj(4); //prints : 40
}
関数を使用するよりも関数を使用する場合には、値を持つオブジェクトを宣言していると仮定することができます.したがって、この値は、オブジェクトとして機能している内部で保存され、関数を実行するたびに(すなわち、オブジェクトを関数として呼び出すたびに)、既存の状態に変更を加え、関数を(状態を維持しない状態で)関数を削除するだけではありません.
したがって、上記のコードでは、番号4を値10に乗算します.ここでは、値10はハードコーディングされていません.obj .別の状態の値を持つオブジェクトを作成することができます.ここでは、ハードコードされた値ではなくオブジェクトの状態への変更を適用しています.

まとめ


FUNCTORS ARE THE OBJECTS WHICH COULD BE USED LIKE A FUNCTION


私のコンテンツを読んであなたの時間を費やしていただきありがとうございます.それは私にたくさん意味します.私は読書とあなたのコメントを聞くのが好きです.あなたのフィードバックは、私はあなたのフィードバックを残してください❤.