+ 9
I want to know the reason behind the unusual output of this constructor-destructor problem?
#include <iostream> using namespace std; class A{ public: A() {cout<<"a";} ~A() {cout<<"b";} }; class B {public: B() {cout<<"c";} ~B() {cout<<"d";} }; int main() { B b; A a; return 0; } The above program gives the output- ( cabd) please explain why?
10 ответов
+ 15
The destructors are called when the object are explicitly destroyed or when the program ends... and so far as it seems, the objects are deleted from memory in a LIFO order (Last in, First out)
+ 4
The destructor is ran when an object is deleted from memory. Your main doesn't say to get rid of anything before it gets to the end. Your main is: Create a B, create an A, exit the program with return code 0 (exiting thus deletes the objects). Destructors aren't ran immediately after constructors, destructors are only there to do stuff when the object is deleted.
I think you're treating the class like a function, as in it goes through everything line by line. Classes are their own little blueprint for an entity, constructors and destructors being defined functions relating to the class they're assigned to. They are separate from one another.
+ 2
As if was written above, these objects are built in the stack, so naturally they are released in reverse order.
https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
+ 1
You create a B so it calls B's constructor to print a c. You make an A so it calls A's constructor to print an a. Same story for the return, it destructs the objects in the order declared (I believe, or the order in memory?) so A's destructor to print b is invoked and d from B is invoked.
+ 1
but brother ahkrin,
like you said....at first the B class is called.thus it operates the constructor part.but it must print for the destructor part too before leaving class B and moving onto class A.
you can cross check this with class A's example.the constructor part is printed.afterwards the destructor part is printed together.
this is my opinion....think on it.
may be I am wrong.then please correct me.and make me understand ur point of view..I would be so much thankful to u.
+ 1
oh...that sounds pretty reasonable.I think this has cleared my doubt.you explained it so well.thanks brother.
+ 1
this seems to be like variables are stored in. a stack. am I right bro.?
0
Yes... that's what it seems...I'm not sure if that behavior is compiler dependant... but at least in here it behaves like a stack..
0
voce
0
it's just like opening and closing braces... {(.....)}. so first when u open the curl brace that is according to your program object 'b' so that constructor is called.. and then the A class constructor so the brace has to be closed ... so first the normal bracket that is A destructor followed by B destructor!!