Operator

operator.png

はじめに

イコールの場合とプラスマイナスとかの場合で書き方が 違うから注意。

単項演算子 = ++ -- += -= *= /= %= ^= &= |= »= «= !=
2項演算子 * / + - % ^ & | ~ ! = < ? <<
» == <= >= && || ->* , -> [] () new new[] delete delete[]

オーバーロード不可能な演算子

  • ::(スコープ解決)
  • .(メンバ選択)
  • .*(メンバポインタを介したメンバ選択)

演算子とはなんなのか?

CMiffy operator+(const CMiffy _in){return CMiffy(_in.val+val);}

で、
void main(){
CMiffy a;
CMiffy b;
CMiffy c=a+b;
}

CMiffy c=a+b;

は以下と同じ意味

CMiffy c=a.operator+(b);

つまり、どの演算子ももともとはクラスの関数の省略記法に過ぎないということ。

演算子と演算子関数定義の関係

2項演算子の場合

任意の2項演算子@について 
aa@bbは

aa.operator@(bb)

または

aa.operator@(aa,bb)

と解釈される。
つまり、書き方は

CMiffy operator@(右オペランド){...}
//または
CMiffy operator@(左オペランド,右オペランド){...}

CMiffy operator@(左オペランド,右オペランド){…}

の場合は、CMiffyが右オペランドになってしまった場合にも対処できる(c2679エラーに対処可能ってこと)
そして、operatorをメンバ変数として書くやり方はEffective C++第19項によれば非推奨である

イコールの場合

コピーコンストラクタを参照にせよ

プラスマイナスなどの2項演算子

引数がひとつのタイプ

vec3<T> operator+(const vec3<T>& _in){//_inは右側の項
            return vec3<T>(x+_in.x,y+_in.y,z+_in.z,w+_in.w);
        }

引数が2個のタイプ

classreturn effective c++の戻り値は参照にしないについて

関連エラー

C2659:関数が演算子の左側にあります。
オーバーロードされた関数が、指定された演算子の左側にあります。
クラス名 var(arg);
クラス名 var;とすべきところを
クラス名 var();
みたいに、コンストラクタ引数がないくせに無駄にかっこをつけたらこのエラーが出てきた。
c2679二項演算子 '«' : 型 'クラス名' の右オペランドを扱う演算子が見つかりません (または変換できません)。

[]配列の添え字参照演算子

T operator[](int _index){
            return m[_index];
        }

newのオーバーロード

なんと、newdelete*もオーバーロードできるのだ。
しかも、オーバーロードすることが推奨されている。
じゃあ私が今までよくArrayInit()という名前で書いてた関数はオペレータnewに直した方がいいのかな?

アドバイス

  • operator»とopetarot«はfriend関数にすること

サポートサイト Wikidot.com