以下のコードでは、名前のないA
変数をのctorに渡すとB
、その変数は行の後に破棄されます。この答えによると:
一時オブジェクトは、それらが含まれる完全な式の最後で破棄されます。完全な式は、他の式の部分式ではない式です。通常、これは
; (or ) for if, while, switch etc.)
ステートメントの終わりを示すことで終了することを意味します。
私はそれを取得しますが、それが破壊された後、クラスはどのようB
にしてその変数の値を知ることができますか?のコピーコンストラクターがenverと呼ばれmamber_a
ていることを知っています。A
これはどのように可能ですか?
#include <iostream>
using namespace std;
class A
{
int sign;
A();
const A & operator=(const A &);
public:
A(int x) : sign(x) {
cout << "A ctor : " << sign << endl;
}
void WriteA() const {
cout << sign << endl;
}
~A() {
cout << "A dtor : " << sign << endl;
}
A(const A &) {
cout << "A copied : " << sign << endl;
}
};
class B
{
int sign;
const A & member_a;
public:
B(const A & aa , int ww ) : sign (ww) ,member_a(aa) {
cout << "B ctor : " << sign << endl;
}
void WriteB() const {
cout << "Value of member_a :";
member_a.WriteA();
}
~B() {
cout << "B dtor : " << sign << endl;
}
};
int main() {
A a(10);
B b1(a,1);
b1.WriteB();
B b2(A(20),2);
b2.WriteB();
return 0;
}
出力は次のとおりです。
A ctor : 10
B ctor : 1
Value of member_a :10
A ctor : 20
B ctor : 2
A dtor : 20
Value of member_a :20 // Object A was destructed. Where does this 20 come from?
B dtor : 2
B dtor : 1
A dtor : 10