#include <iostream>

class X {
   private:
      const char* name;
   public:
      X(const char* name) : name(name) {
	 std::cout << "X \"" << name << "\" constructed" << std::endl;
      }
      ~X() {
	 std::cout << "X \"" << name << "\" destructed" << std::endl;
      }
};

class Y {
   public:
      Y(const char* name) : x("within Y"), name(name) {
	 std::cout << "Y \"" << name << "\" constructed" << std::endl;
      }
      ~Y() {
	 std::cout << "Y \"" << name << "\" destructed" << std::endl;
      }
   private:
      X x;
      const char* name;
};

X x = "global x";

int main() {
   X x1 = "local x1";
   Y* yp = new Y{"*yp (on heap)"};
   X x2 = "local x2";
   delete yp;
}
