2

次の例のように、+演算子がフレンドである必要があるのに、()演算子のオーバーライドが「フレンド」になれない(したがって、「this」追加パラメーターが必要)のはなぜか疑問に思います。

class fnobj
{
    int operator()(int i);
    friend int operator+(fnobj& e);
};

int fnobj::operator()(int i)
{

}

int operator+(fnobj& e)
{

}

+演算子は、この「追加の」余分なパラメーターを回避するためにフレンドである必要があることを理解しましたが、なぜoperator()がそれを必要としないのですか?

4

2 に答える 2

4

単項プラス演算子をオーバーロードしました。そして、あなたはおそらくそれをしたくなかったでしょう。+2つのオブジェクトを追加するのではなく、aがその前に表示されたときに、解釈されるのと同じように1つのオブジェクトを解釈する方法を説明しますint x = +10。(と同じように解釈されますint x = 10

加算演算子の場合、「+演算子はフレンドである必要がある」というのは正しくありません。

fnobj2つのオブジェクトを追加する2つの方法は次のとおりです。

int operator+(fnobj& e);
friend int operator+(fnobj& left, fnobj& right);

最初の形式でthisは、はの左側のオブジェクトであると見なされます+。したがって、どちらの形式も事実上2つのパラメーターを取ります。

したがって、質問に答えるには、「operator()は必要ない」と考えるのではなく、「operator()が必要」、さらには「オブジェクトを関数として扱うにはオブジェクトが必要friend」と考えてください。this

于 2012-10-06T23:28:57.080 に答える
2

あなたはこれを正しく理解していませんでした(そしてそれを正しく使用していません)。

C ++には、クラスの二項演算子をメンバー関数として定義する方法が2つあります。

class A
{
public:
    int operator+ (A const& other);
};

または無料の機能として

class A {};

int operator+ (A const& lhs, A const& rhs);

現在混乱しているのは、クラススコープでこのfree関数をとして宣言および定義できることですfriend。これにより、関数はクラスのプライベートメンバーを使用できるようになります(これは、free関数では一般に許可されていません)。

于 2012-10-06T23:33:03.733 に答える