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

C++初心者で、現在オペレーターの使用方法について勉強しています。

下記プログラムの「 x = x + z;」箇所の処理について、理解できず行き詰っています。
初期化した際のx, y, zそれぞれの値が
x = Help
y = !e
z = M
となったところまでは、理解できています。

その後、x = x + zの処理に入る際、
1.abc operator+(abc)
2.void operator=(abc)
の順でオペレーターの処理を行うと思います。

その際、1.はzを使用して処理をするところまでは分かるのですが、
return value: HelpM\n(\:バックスラッシュ)がx, y, zのどこに入るのか、
その後どのオブジェクトを持って2.の処理に入るのかどうか
理解できておりません。

初心者のため、文章がわかりづらい点等あるかと思いますが、
アドバイス頂けたら幸いです。

宜しくお願いいたします。

==========================================================================
#include <cstdio>
#include <cstring>

class abc {
char def[21];
public:
abc(void) { strcpy(def, "Help"); }
abc(const char s[ ]) { strcpy(def, s); }
abc(char c) {
def[0] = c;
def[1] = '\0';
}
void operator=(abc); // redefines = between abc's!!!
abc operator+(abc);
void out( ) {
printf("%s\n", def);
}
};

void abc::operator=(abc x) {
int i, n = strlen(x.def);
for(i = 0; i < n; i++)
def[i] = x.def[n - (i + 1)];
def[n] = '\0';
}

abc abc::operator+(abc a) {
int i = 0;
abc c;
strcpy(c.def, def);

while(c.def[i] != '\0')
i++;
for(int j = 0; a.def[j] != '\0'; j++) {
c.def[i] = a.def[j];
i++;
}
c.def[i] = '\0';
return c;
}

int main( ) {
abc x, y("!e"), z('M');
x = x + z;
x.out( );

y = y + x;
y.out( );
return 0;
}

A 回答 (2件)

> デバック処理で追った結果、abc::operator+(abc a)を抜けた時点で、x.defが"HelpM"に変更されており、その後xを引数としてabc::operator=(abc x)へ処理しているように見えました。



そうですか?
operator+の定義からすると、新たにcというオブジェクトを作成して、cにxの内容をコピーし、cに対してaの内容を結合したあとでcをreturnしていると思いますが。

> x=xから処理されないのは何故でしょうか。

演算子には優先順位というものがあります。代入演算=は加算演算子+よりも優先順位が低いため、+の方が先に処理されます。
算数で、1+2*3は2*3を先に計算すると教わりましたよね。それと同じように、演算子によって優先順位が付けられていて、順位の高いものから処理されます。順位が同じ場合には計算の方向が決められています。例えば、+を複数使用した式の場合、左から右へ処理すると決められているため、a+b+cはa+bを先に処理する、つまり(a+b)+cとして処理されます。代入演算子=の場合は逆に右から左と決められているため、a=b=1はb=1のあとでa=bが処理されます。
    • good
    • 0
この回答へのお礼

優先順位について把握していなかったので、とても勉強になりました。
そして、処理の流れが理解でき、他のプログラムも問題なく読めました。
ご丁寧な回答をありがとうございました。

お礼日時:2013/02/14 12:39

> return value: HelpM\n(\:バックスラッシュ)がx, y, zのどこに入るのか、



どこにも入りません。だって、そんな処理はコードに書かれていないでしょ。
x+zの結果は一時オブジェクトとして、既存のオブジェクトとは別に保持されます。

これは、クラスに限ったことではありません。
3つのdouble型変数a,b,cがあったとして、a+b+cを計算する場合に、まずはa+bを計算します。その結果はaにもbにもcにも入りませんよね。a+bの結果は一時的な変数に保存し、その値とcを加算します。

この回答への補足

回答ありがとうございます。

デバック処理で追った結果、abc::operator+(abc a)を抜けた時点で、x.defが"HelpM"に変更されており、その後xを引数としてabc::operator=(abc x)へ処理しているように見えました。

>3つのdouble型変数a,b,cがあったとして、a+b+cを計算する場合に、まずはa+bを計算します。
>その結果はaにもbにもcにも入りませんよね。a+bの結果は一時的な変数に保存し、その値とcを加算します。
⇒今回の、x = x + zは、x(z)をまず行い、x(x(z))を行っているように見えるのですが、
x=xから処理されないのは何故でしょうか。

補足日時:2013/02/14 10:07
    • good
    • 0

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