Class B;
B *b = new B(); // default constructor
B *b1 = new B(10); // constructor which takes an argument B(int x)
However, if we want to wr
Your question should be:
How compiler distinguish between
new B()
andnew B(10)
, when theB::operator new
syntax is same ?
Well, new
just allocates the memory and immediately after that the compiler inserts the call to the constructor. So it's irrespective if you call new B
, new B()
or new B(10)
.
Compiler interprets something like:
B *b = static_cast<B*>(B::operator new(sizeof(B)))->B();
B *b1 = static_cast<B*>(B::operator new(sizeof(B)))->B(10);
In actual a constructor doesn't return anything. But above pseudo code is just an analogical representation of internal stuff.
The question of which constructor to call is a matter of overload resolution based on the argument list, similar to any overloaded function call. At the site where new B(...) occurs, all the information is available. The compiler can resolve the reference to class B (name lookup), and see the portfolio of constructors available, and also see that B has a custom memory allocator mechanism. The compiler can emit the code to use that memory allocator to get the space (passing in the size of B), and then invoke appropriate constructor code to initialize the object in that space.