アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在C++についての学習を進めているのですが、
2項演算子のオーバーロードで理解できないところがありますので、よろしかったらご教授ください。

//+をcoordクラスに対してオーバーロードする
#include<iostream>
using namespace std;
class coord{
int x,y;
public:
coord() {x=0;y=0;}
coord(int i,int j) {x=i;y=j;}
void get_xy(int &i,int &j) {i=x;j=y;}
coord operator+(coord ob2);
};

//+をcoordクラスに対してオーバーロードする
coord coord::operator+(coord ob2)
{
coord temp;
temp.x = x + ob2.x;
temp.y = y + ob2.y;
return temp;
}
int main()
{
coord o1(10,10),o2(5,3),o3;
int x,y;
o3 = o1 + o2;
o3.get_xy(x,y);
cout << "(o1+o2) X:" << x << ",Y:" << y << endl;
return 0;
}

この文の中で、o3.get_xy(x,y);というコードがありますが、
ここの部分がよくわからないのです。
そもそも、引数としてx,yがありますが、これはprivateメンバを
見に行きなさい。っと言っているのでしょうか?
main()の中から直接使っている??
それとも??
すいません。この辺の理解が薄いようなので、2項演算子のオーバーロードとは関係ないかもしれませんが、教えてください。
よろしくお願いします。

A 回答 (3件)

#2のhpskです。



noriemonさんはひょっとしてJava経験者でしょうか?

> C++の場合は、変数を初期化しなくっても使えるっということなのでしょうか?
初期化していないとコンパイルエラーになるかどうか、ということならエラーにはなりません。
ただし、初期化されていない変数の値を参照したとき、その値は保証されません(気のきいたコンパイラは警告を出してくれます)。この点はCと同じです。
JavaやC#ではコンパイル時にエラーになります。

ただ、今回のプログラム例では、mainのx,yは値が参照される前にちゃんとした値が代入されてますから、上記の問題はありません。
Cの感覚だと、get_xyの呼び出しで渡しているのはxやyの値に見えますが、渡しているのはx,yへの「参照」であって、それが代入先になっているだけです。(このへんの見にくさがC++の文法の問題の一つでもあります)

たとえば、coordクラスに
void set_xy(int i,int j) {x=i;y=j;}
のようなメンバ関数があって、これがmain内でx,yの初期化前に呼ばれると問題ですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
そうです。まさに、CとJAVAの知識が混乱していたみたいです。やはり、教えていただいても、「参照」の扱いが難しいなぁ。なんて思ってしまいますが、、、
とにかく、的確な回答ありがとうございました。
またどうぞよろしくお願いします。

お礼日時:2004/09/03 09:34

main中の


o3.get_xy(x,y);
のx,yは、mainの先頭で宣言した、x,yを指しています。
このx,yを、coordクラスで定義されている、
void get_xy(int &i,int &j) {i=x;j=y;}
の引数として参照渡ししています。
よってこのとき、get_xyの中のi,jはmain関数内のx,yを参照していることになります。
get_xy中に書かれているx,yは、coordクラス中でprivateで定義されている、x,yを指しています。今回の場合は、o3.xとo3.yですね。
結果として、main関数中のx,yにそれぞれo3.x、o3.yの代入されるわけです。

> 2項演算子のオーバーロードとは関係ない
直接関係ないですが、今後、演算子のオーバーロードを記述するにあたって、この辺りの理解は必要だと思います。

この回答への補足

さっそくのお返事ありがとうございました。

もう少しだけ質問なのですが、
C++の場合は、変数を初期化しなくっても使えるっということなのでしょうか?
それとも、こういう形で初期化をするっということなのでしょうか?
すみません。頭がこんがらがってきました。
よかったら教えてください。

補足日時:2004/09/02 14:18
    • good
    • 0

> この文の中で、o3.get_xy(x,y);というコードがありますが、ここの部分がよくわからないのです。


> そもそも、引数としてx,yがありますが、これはprivateメンバを見に行きなさい。っと言っているのでしょうか?

ちがいます。

void coord::get_xy(int &i,int &j) {i=x;j=y;}
なので ふたつの引数は 参照体。

o3.get_xy(x,y) はo3が持つ座標を x, y にセットして戻ってきます。

演算子オーバロードとはまったく関係ありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!