Joe Duffy presented an interesting example where order of members initialization is different between C# and C++ in his On partially-constructed objects blog post. "In C#, member initializers run from most derived first, to least derived. In C++, however, member initializers run alongside the ordinary construction process." I've traced his examples in Runtime Flow.
This C# program will print E_init, D_init, C_init, C_ctor, D_ctor, and then E_ctor:using System; class C { int x = M(); public C() { Console.WriteLine("C_ctor"); } private static int M() { Console.WriteLine("C_init"); return 42; } } class D : C { int x = M(); public D() : base() { Console.WriteLine("D_ctor"); } private static int M() { Console.WriteLine("D_init"); return 42; } } class E : D { int x = M(); public E() : base() { Console.WriteLine("E_ctor"); } private static int M() { Console.WriteLine("E_init"); return 42; } } class Program { public static void Main() { new E(); } }
This C++ program will print C_init, C_ctor, D_init, D_ctor, E_init, E_ctor, ~E, ~D, and finally ~C:
#include using namespace std; struct C { int x; C() : x(M()) { cout << "C_ctor" << endl; } ~C() { cout << "~C" << endl; } static int M() { cout << "C_init" << endl; return 42; } }; struct D : C { int x; D(): x(M()) { cout << "D_ctor" << endl; } ~D() { cout << "~D" << endl; } static int M() { cout << "D_init" << endl; return 42; } }; struct E : D { int x; E() : x(M()) { cout << "E_ctor" << endl; } ~E() { cout << "~E" << endl; } static int M() { cout << "E_init" << endl; return 42; } }; static void main() { E e; }
You see how in C# E's member is constructed even before the D object, while in C++ E's member is constructed the last. It is interesting to note that while logically members are initialized before constructors, technically constructors start first and then immediately initialize members.
Copyright 2008 - 2024 Vlasov Studio (Best in class Visual Studio extensions and tools)