• ベストアンサー

関数の多重定義(同一タイプの「リファレンス」「値渡し」)

目黒@C++学習中 です。 下記のソースの実行結果が c:\c++oo\pointline\clspoint.h(27) : 値渡し   P(7,7) c:\c++oo\pointline\clspoint.h(27) : 値渡し   P(7,7) となります。 同一タイプの「リファレンス」と「値渡し」の 多重定義は可能なのでしょうか? それとも、もっと基本的な間違え? [環境]NT4 VC6.0(SP3) #include "clsPoint.h" int main() { Point oP1(2,5); Point oP2(5,2); Point oP3; Point& opP1 = oP1; Point& opP2 = oP2; oP3 = opP1 + opP2; oP3 = oP1 + oP2; cout << oP3 << endl; return 0; } #include <float.h> #include <crtdbg.h> typedef const double cdouble; class Point; typedef const Point cPoint; cdouble dNULL = DBL_MAX; class Point { private: double m_dX; double m_dY; public: Point() : m_dX(dNULL), m_dY(dNULL){}; Point(cdouble dX, cdouble dY) : m_dX(dX), m_dY(dY){}; public: Point operator + (cPoint& oP2) { _RPTF2(_CRT_WARN,"リファレンスP(%g,%g)\n",m_dX+oP2.m_dX , m_dY+oP2.m_dY); return Point(m_dX+oP2.m_dX , m_dY+oP2.m_dY); } Point operator + (cPoint oP2) { _RPTF2(_CRT_WARN,"値渡し   P(%g,%g)\n",m_dX+oP2.m_dX , m_dY+oP2.m_dY); return Point(m_dX+oP2.m_dX , m_dY+oP2.m_dY); } };

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

規約をわかってないと「?」な現象に思えますよね。 詳しくはヘルプ(C++ランゲージリファレンス→オーバーロード →引数の型の違い)を見て欲しいのですが、少し解説を。 # 私が参照できるのは VC4.2 のヘルプなので、多少表現が # 違うところがあってもご勘弁 基本的に「ある型の引数と、この型への参照は ... オーバーロードに 関しては同一とみなされます」。 ただし、「const や volatile をつけた型への参照と、基本型への 参照とは区別できます」。 typedef をつけないと、ふたつのメソッドの引数は   const Point&   const Point ですが、const Point は、メソッドの中で const として扱われる だけで、Point のコピーコンストラクタが呼ばれますから、 Point& を受け取るのと同等です。なので、   const Point&   Point& の違いであり、これは区別されるのです。 一方、operator + を呼び出す側の Point は、const ではありませんから (Point& 相当の)const Point の方で解決をします。 例えば、   const Point opP2(oP2); としてみてください。 const な opP2 を引数にする方は "リファレンス" を出力する方の メソッドが呼び出されることを確認できるはずです。 もう一度書きます。 > 同一タイプの「リファレンス」と「値渡し」の > 多重定義は可能なのでしょうか? できません。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.1

基本的にあいまいな実装は、コンパイル時に、あいまいなメソッドが呼ばれる行 (個の場合、oP3=opP1+opP2)で、 警告が出ると思うんだけど… 警告が出ないというのは不思議だなー あと、同一タイプの「参照」と「値渡」では区別がつかない(意図するほうにわたせない)よね~。 参照は実際には都合上『参照型』といっているだけで、参照型という型を持っているわけではないので、区別が・・・・ oP3 = (Point&)oP1 + (Point&)oP2; で渡せるかもね(あまりしないというか定義してもこれでは使われない) Point& ooP1は常に oP1と置き換えてよまんといかんです。 あと、似たような議題があがるのは、 変換コンストラクタと、変換演算子とか・・・

すると、全ての回答が全文表示されます。

関連するQ&A