2017年10月19日
《その85》 挿入子の多重定義
挿入子の多重定義
挿入子の多重定義について簡単にまとめてみました。次のプログラムと説明を見てください。
#include <iostream>
class Xy {
int x_;
int y_;
public:
Xy(int x, int y) {
x_ = x;
y_ = y;
}
int x() const { return x_; }
int y() const { return y_; }
};
std::ostream& operator<<(std::ostream& s, const Xy& a) { // (T)
return s << "x … " << a.x() << ", y … " << a.y() << '\n';
}
int main() {
Xy p(100, 200); const Xy q(888, 999);
std::cout << p; // (U)
std::cout << q; // (V)
}
メンバ関数として定義された2項演算子では、
左オペランドが関数の第1引数として渡され、
右オペランドが関数の第2引数として渡される
ことになっています。
このため、(U) では、
「 << 」の左側の「 std::cout 」が
(T) の関数「 operator<< 」の第1引数「 std::ostream& s 」に渡され、
右側の「 p 」 が
(T) の関数「 operator<< 」の第2引数「 const Xy& a 」 に渡される
ことになります。
その結果、(T) の関数の
「 s << "x … " << a.x() << ", y … " << a.y() << '\n'; 」は
「 cout << "x … " << a.x() << ", y … " << a.y() << '\n'; 」となり、
期待する結果が得られることになります。
〈その他〉
※ (T) で、関数「 operator<< 」は、第1引数「 std::ostream& s 」が受け取った ostream
への参照をそのまま返却していますが、これは挿入子「 << 」の連続使用を可能にするためです。
※ (U) で、関数「 operator<< 」は、第2引数「 const Xy& a 」を参照渡しで受け取って
います。これは、受け取る際のコストを小さくするためです。
また、単なる参照でなく const参照になっているので、(V)の q を受け取ることも可能です。
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6874192
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック