1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
#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;
}