#include <iostream>
#include <string>
using namespace std;
class A
{
public :
A( const A& other)
: name( other.name )
{
cout << "A(" << name << ")::copy-constructor(), this = " << this << endl;
}
A( string name)
: name( name)
{
cout << "A(" << name << ")::constructor(), this = " << this << endl;
}
~A( )
{
cout << "A(" << name << ")::destructor(), this = " << this << endl;
}
private :
string name;
} ;
class C
{
public :
C( string name, A a)
: name( name) , a( a)
{
cout << "C(" << name << ")::constructor()" << endl;
}
~C( )
{
cout << "C(" << name << ")::destructor()" << endl;
}
private :
string name;
A a;
} ;
class B
{
public :
B( string name)
: name( name)
{
cout << "B(" << name << ")::constructor()" << endl;
}
~B( )
{
cout << "B(" << name << ")::destructor()" << endl;
}
private :
string name;
A a1{ "a1" } ;
A a2{ "a2" } ;
C c1{ "c1" , a1} ;
A a3{ "a3" } ;
} ;
int main( )
{
B b( "b1" ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEEKewpwdWJsaWM6CiAgICBBKGNvbnN0IEEmIG90aGVyKQogICAgICAgIDogbmFtZShvdGhlci5uYW1lKQogICAgewogICAgICAgIGNvdXQgPDwgIkEoIiA8PCBuYW1lIDw8ICIpOjpjb3B5LWNvbnN0cnVjdG9yKCksIHRoaXMgPSAiIDw8IHRoaXMgPDwgZW5kbDsKICAgIH0KICAgIEEoc3RyaW5nIG5hbWUpCiAgICAgICAgOiBuYW1lKG5hbWUpCiAgICB7CiAgICAgICAgY291dCA8PCAiQSgiIDw8IG5hbWUgPDwgIik6OmNvbnN0cnVjdG9yKCksIHRoaXMgPSAiIDw8IHRoaXMgPDwgZW5kbDsKICAgIH0KICAgIH5BKCkKICAgIHsKICAgICAgICBjb3V0IDw8ICJBKCIgPDwgbmFtZSA8PCAiKTo6ZGVzdHJ1Y3RvcigpLCB0aGlzID0gIiA8PCB0aGlzIDw8IGVuZGw7CiAgICB9CnByaXZhdGU6CiAgICBzdHJpbmcgbmFtZTsKfTsKCmNsYXNzIEMKewpwdWJsaWM6CiAgICBDKHN0cmluZyBuYW1lLCBBIGEpCiAgICAgICAgOiBuYW1lKG5hbWUpLCBhKGEpCiAgICB7CiAgICAgICAgY291dCA8PCAiQygiIDw8IG5hbWUgPDwgIik6OmNvbnN0cnVjdG9yKCkiIDw8IGVuZGw7CiAgICB9CiAgICB+QygpCiAgICB7CiAgICAgICAgY291dCA8PCAiQygiIDw8IG5hbWUgPDwgIik6OmRlc3RydWN0b3IoKSIgPDwgZW5kbDsKICAgIH0KcHJpdmF0ZToKICAgIHN0cmluZyBuYW1lOwogICAgQSBhOwp9OwoKY2xhc3MgQgp7CnB1YmxpYzoKICAgIEIoc3RyaW5nIG5hbWUpCiAgICAgICAgOiBuYW1lKG5hbWUpCiAgICB7CiAgICAgICAgY291dCA8PCAiQigiIDw8IG5hbWUgPDwgIik6OmNvbnN0cnVjdG9yKCkiIDw8IGVuZGw7CiAgICB9CiAgICB+QigpCiAgICB7CiAgICAgICAgY291dCA8PCAiQigiIDw8IG5hbWUgPDwgIik6OmRlc3RydWN0b3IoKSIgPDwgZW5kbDsKICAgIH0KcHJpdmF0ZToKICAgIHN0cmluZyBuYW1lOwogICAgQSBhMXsiYTEifTsKICAgIEEgYTJ7ImEyIn07CiAgICBDIGMxeyJjMSIsIGExfTsKICAgIEEgYTN7ImEzIn07Cn07CgppbnQgbWFpbigpCnsKICAgIEIgYigiYjEiKTsKICAgIHJldHVybiAwOwp9
stdout
A(a1)::constructor(), this = 0xbff3512c
A(a2)::constructor(), this = 0xbff35130
A(a1)::copy-constructor(), this = 0xbff350e8
A(a1)::copy-constructor(), this = 0xbff35138
C(c1)::constructor()
A(a1)::destructor(), this = 0xbff350e8
A(a3)::constructor(), this = 0xbff3513c
B(b1)::constructor()
B(b1)::destructor()
A(a3)::destructor(), this = 0xbff3513c
C(c1)::destructor()
A(a1)::destructor(), this = 0xbff35138
A(a2)::destructor(), this = 0xbff35130
A(a1)::destructor(), this = 0xbff3512c