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;
}
No.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が処理されます。
優先順位について把握していなかったので、とても勉強になりました。
そして、処理の流れが理解でき、他のプログラムも問題なく読めました。
ご丁寧な回答をありがとうございました。
No.1
- 回答日時:
> 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から処理されないのは何故でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/03/09 14:24
- Excel(エクセル) EXCELで同一セル内で自動的に改行されてしまう(難問) 6 2023/04/16 00:51
- Windows 10 windows11にて管理者アカウントを削除してしまいました。 現在どのような状況かもあまり分かって 5 2023/01/02 20:41
- UNIX・Linux bashでシングルクォート内の変数の組み込み方教えてください。 2 2023/02/14 19:30
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- 数学 △ABC≡△DEF≡△GHIという感じで書き表すのはダメですか? 3 2022/10/23 01:58
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Excel(エクセル) Excelで、半角スペースをTABに変換する 5 2022/10/18 14:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
もしかして
-
エクセルで、日付を入力すると...
-
「ご処理進めて頂きますようお...
-
VBAでループ内で使う変数名を可...
-
VBAでセルに値が入力されるまで...
-
【Excel】特定の文字を含むセル...
-
自分の不注意で仕事で乗り合い...
-
メルカリのメルカードで買い物...
-
リョウ・・・量?料?
-
VBA SaveChanges 上書きされない
-
switch の範囲指定
-
VBAでGetAsynckeyStatekのエラー
-
全てのフォルダから最新ファイ...
-
インタラクティブの反対語は?
-
VBAのオートフィルについて
-
セックスレスの既婚女性は自慰...
-
DoEventsがやはり分からない
-
計算の問題なのですが、 例えば...
-
findは動くがfindnextがマクロ...
-
お家デートをしててハグを長い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
EXCEL VBA マクロ 実行する度に...
-
switch の範囲指定
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
UMLでの例外処理
-
Do~Loopした回数をカウントしたい
-
VB.NET Excelを読み込んでDataT...
-
月度は何て読みますか?
-
findは動くがfindnextがマクロ...
-
リョウ・・・量?料?
-
iD
-
VBA SaveChanges 上書きされない
-
Select Case文でこのようなこと...
-
Loadイベント中にほかのイベン...
-
セルの値が0はクリアするマクロ
おすすめ情報