10

このスレッドへの返信によるとoperator=、非メンバー関数としてオーバーロードすることはできません。したがって、たとえば、次の場合、コンパイラは非常に怒っています。

class MyClass
{
    // ...
};

MyClass& operator=(MyClass& Left, MyClass& Right)
{
    // ...
}

どうしてこれなの?ゲッターとセッターを含むコンテナー クラスがあるため、メンバー関数は不要であり、カプセル化が壊れます。前述のスレッドへの回答の1つは、「L値が最初のオペランドとして受け取られる」ことを確認することであると述べましたが、それが何を意味するのか完全にはわかりません。誰か明確にしてくれませんか?

さらに、operator=operator()operator[]およびoperator->「オッドボール」ケースはありますか? それとも、オーバーロードされたすべての演算子をメンバー関数として実装する必要がありますか? (そうでなければ完全に合法であることは知っていますが、より良い方法を探しています。)

4

2 に答える 2

6

クラスに (メンバーとして) 代入演算子がない場合、コンパイラは、指定しない場合にコピー コンストラクターを生成するのと同様に、既定で代入演算子を生成します。

したがって、後で非メンバー代入演算子を定義しようとすると、「怒って」しまいます。そしたら2つになります!

于 2011-03-21T16:39:37.117 に答える
1

どうしてこれなの?

宣言しない限り、コンパイラoperator=は署名operator= (C&, C&)またはを使用してクラスで を宣言しますoperator= (C&, const C&)

割り当てをオーバーロードすることが許可されている場合、ほとんどの使用はあいまいになります。

次に、次のいずれかに対して追加の規則を求めるロビー活動を行う可能性があります。

  • operator=非メンバーがメンバーoperator=を隠しているかのように、ユーザーが宣言したコンパイラが可視であると宣言されていないふりをするoperator=
  • オーバーロード中に、ユーザーが宣言した割り当てをより適切に一致させます。

どちらを選択しても、すでに非常に複雑なルールが複雑になり、 のためだけに特別なケースが追加されoperator=ます。

そこに行きたいと思う人はほとんどいません。

また、この機能の正当な使用法を公開していません。

または、まったく合理的な使用。

C++ のルールは、合理的な使用例を示すことができる場合にのみ、さらに複雑になります。

于 2011-12-12T01:40:44.473 に答える