-PR-
解決済み

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

  • 暇なときにでも
  • 質問No.62042
  • 閲覧数105
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 14% (3/21)

目黒@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);
}
};
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

規約をわかってないと「?」な現象に思えますよね。

詳しくはヘルプ(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 を引数にする方は "リファレンス" を出力する方の
メソッドが呼び出されることを確認できるはずです。


もう一度書きます。

> 同一タイプの「リファレンス」と「値渡し」の
> 多重定義は可能なのでしょうか?

できません。
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル11

ベストアンサー率 61% (157/255)

基本的にあいまいな実装は、コンパイル時に、あいまいなメソッドが呼ばれる行
(個の場合、oP3=opP1+opP2)で、
警告が出ると思うんだけど…

警告が出ないというのは不思議だなー
あと、同一タイプの「参照」と「値渡」では区別がつかない(意図するほうにわたせない)よね~。

参照は実際には都合上『参照型』といっているだけで、参照型という型を持っているわけではないので、区別が・・・・
oP3 = (Point&)oP1 + (Point&)oP2;
で渡せるかもね(あまりしないというか定義してもこれでは使われない)
Point& ooP1は常に oP1と置き換えてよまんといかんです。

あと、似たような議題があがるのは、
変換コンストラクタと、変換演算子とか・・・


このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ