現在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項演算子のオーバーロードとは関係ないかもしれませんが、教えてください。
よろしくお願いします。
No.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の初期化前に呼ばれると問題ですね。
回答ありがとうございます。
そうです。まさに、CとJAVAの知識が混乱していたみたいです。やはり、教えていただいても、「参照」の扱いが難しいなぁ。なんて思ってしまいますが、、、
とにかく、的確な回答ありがとうございました。
またどうぞよろしくお願いします。
No.2
- 回答日時:
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++の場合は、変数を初期化しなくっても使えるっということなのでしょうか?
それとも、こういう形で初期化をするっということなのでしょうか?
すみません。頭がこんがらがってきました。
よかったら教えてください。
No.1
- 回答日時:
> この文の中で、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 にセットして戻ってきます。
演算子オーバロードとはまったく関係ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
変数の型を定義しなかった場合...
-
C++でboolにintの値を代入する...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
配列を用いない最大値の求め方
-
namespace定義の使い方
-
enumについて
-
C++の(左辺値)参照を参照渡し
-
コンパイルすると error C1083 ...
-
GCCで暗黙の型変換の警告を出し...
-
main()とint main(void)の違い
-
値を返り値に返すのと参照渡し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
visualstudio C# テキストボッ...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
enumについて
-
構造体の宣言でエラーが出ます。
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
0除算を判定したい
-
構造体の要素すべてに対する四...
-
値を返り値に返すのと参照渡し...
-
namespace定義の使い方
-
GCCで暗黙の型変換の警告を出し...
おすすめ情報