C++ の知識を向上させようとしていたときに、古いプログラミング コンテストでこの問題を見つけました。今年はコンテストに挑戦するので、準備を整えたいと思います。
次のプログラムの出力は何ですか?
#include <iostream>
using namespace std;
int dat=1;
int counter=0;
class ClassB;
class B {
public:
virtual void f(int d=5)=0;
};
class A {
unsigned i;
public:
int pod;
int index;
A& operator++() { cout<<"A "<<pod--<<dat++<<endl; A* b=new A; return *b; }
A operator++(int) {cout<<"B "<<pod++<<dat--<<endl; A* b=new A; return *b;}
A& operator--() {cout<<"C "<<dat++ <<++pod<<endl; A* b=new A; return *b;}
A operator--(int) {cout<<"D "<<dat--<<--pod<<endl; A* b=new A; return *b;}
void operator+(A& b) {cout<<"Addition Index "<<index<<endl; pod++;}
friend void B::f(int);
A() : i(0), pod(dat) {pod++; index=++counter; cout<<"CA "<<"Index "<<index<<endl; }
~A(){pod++; cout<<"DA Index "<<index<<endl;}
};
const ClassB& returnClassA(const ClassB& p) {return p;}
class ClassB: public A, public B {
public:
void f(int d=2){A c; c++; pod*=d--;}
ClassB(){cout<<"CB Index "<<index<<endl;}
~ClassB(){cout<<"DB Index "<<index<<endl;}
};
ClassB returnClassB(ClassB s) {return s;}
class ClassC : public ClassB {
public:
ClassC(){cout<<"CC Index "<<index<<endl;}
~ClassC(){cout<<"DC Index "<<index<<endl;}
};
ClassB returnClassC(ClassB s){return s;}
int main()
{
ClassC x;
A v,w;
B *c = new ClassB;
--++v--+++w;
returnClassC(returnClassB(returnClassA(x)));
return 0;
}
これは紙の上で解決するはずですが、私は初心者なのでコンパイラを使用しました。また、変数 counter と index は私が追加したもので、作成中のオブジェクトを追跡できます。元の式は --++v--+++w-- でした。しかし、 --++v--+++w; で変更しました。コンパイラがエラーを出していたからです。
一部:
ClassC x;
A v,w;
B *c = new ClassB;
出力:
- CA インデックス 1
- CB インデックス 1
- CC インデックス 1
- CA インデックス 2
- CA インデックス 3
- CA インデックス 4
- CB インデックス 4
私は理解しています。
次の式 --++v--+++w; を理解するのに問題があります。最初は --++v--++; の出力を理解しようとしました。+w を追加します。
--++v--++; の出力。は:
- D 11
- CA インデックス 5
- B10
- CA インデックス 6
- 0 -1
- CA インデックス 7
- C02
- CA インデックス 8
- DA インデックス 6
- DA インデックス 5
これは、操作の順序が --(++((v--)++)) であることを意味します。これはなぜですか?どの操作が最初に評価されるかに関する規則はありますか? また、Index 6 および 5 のオブジェクトのデストラクタが呼び出される理由がわかりません。
元の表現を使用すると、 --++v--+++w; 、出力は次のとおりです。
- D 11
- CA インデックス 5
- B10
- CA インデックス 6
- 0 -1
- CA インデックス 7
- C02
- CA インデックス 8
- 追加インデックス 8
- DA インデックス 6
- DA インデックス 5
+w 操作が最後に評価されるのはなぜですか? 演算子の優先順位のためですか?また、cout << v.index と書くと 2 が返されることがわかりました。これは、v が以前に作成された元のオブジェクトのままであることを意味します。では、インデックスが 5 ~ 8 のオブジェクトはどこに行くのでしょうか? どうすればアクセスできますか?
最後の部分、 returnClassC(returnClassB(returnClassA(x))); 出力:
- データベース インデックス 1
- DA インデックス 1
- データベース インデックス 1
- DA インデックス 1
- データベース インデックス 1
- DA インデックス 1
デストラクタが呼び出される理由がわかりません。