1. ホーム
  2. C++

[C++】C++オーバーロード opeartor=非静的メンバ関数でなければならない?

2022-02-11 10:07:52
<パス

コード

#include 

using namespace std;

class C {
public:
    int x;
    C () {}
    C(int a) : x(a) {}
    // member function
    C operator = (const C&);
};

C C::operator= (const C& param) {
    x = param.x;
    return *this;
}

int main()
{
    C foo(1);
    cout <<"foo.x = " << foo.x << endl;

    C bar;
    bar = foo;
    cout <<"bar.x = " << bar.x << endl;
    return 0;
}

実行

foo.x = 1
bar.x = 1


エラー

opeartor= must be a nonstatic member function

ノート

引用

<ブロッククオート

いくつかの演算子は、メンバ関数または非メンバ関数として、2つの形式でオーバーロードされる可能性があることに注意してください。
多くの演算子は メンバー関数 非メンバー関数 どちらのフォームも、オーバーロードされた

説明

  • いわゆる メンバー関数 コード セクションでは、オーバーロードされる演算子についてクラス定義で簡単な宣言があります。
    C operator = (const C&);

ここでは、演算子=(等号)がオーバーロードされています。

  • とは対照的に 非メンバー機能 は、そのような記述がないクラス定義で、例えば、あるクラスの完全な定義は、以下のものだけで構成されています。
class D {
public:
    int y;
    D () {}
    D (int b) : y(b) {}
};


    • C++には、次のような多くの演算子があります。 = (等号) としてのみ使用することができます。 メンバー関数 としてのみオーバーロードすることができます。 コード があります。
    • また、以下のような演算子もあります。 +(プラス)記号 として使用することができます。 メンバー関数 として、また 非メンバー関数 がオーバーロードされている。

ダウトフル

私の読みでは トーチュラル [1]クラス(II)/キーワードこの項には、次のようなサンプルコードがあります。

CVector& CVector::operator= (const CVector& param)
{
  x=param.x;
  y=param.y;
  return *this;
}

と書かれていることに注意してください。 CVector& これは、このコードを参照して書かれています。 Class C であれば = (等号) と書くと、次のようになります。 C& しかし、その場合、コンパイラ(DEV C++ ISO C++11)は、次のように報告します。 エラー に修正し、最終的に コード の部分はコンパイルを通過するため、現在あなたのコードはサンプルコードと矛盾しているところです。

参照

<ブロッククオート

クラス(II)
http://www.cplusplus.com/doc/tutorial/templates/