AnyCompiler

Constructors aur RAII

Ek destructor, jo class ke naam ke aage ~ laga kar likha jaata hai, jab ek object scope se bahar jaata hai to automatically chalta hai — deterministically, kisi unpredictable baad ke point par nahi, jaise ek garbage collector ka finalizer ho sakta hai. Ek constructor jo resource acquire karta hai, uska ek destructor ke sath pairing jo use release karta hai, yahi RAII hai: Resource Acquisition Is Initialization.

#include <iostream>
using namespace std;

class Logger {
public:
    Logger() {
        cout << "Logger created" << endl;
    }
    ~Logger() {
        cout << "Logger destroyed" << endl;
    }
};

int main() {
    cout << "Before scope" << endl;
    {
        Logger log;
        cout << "Inside scope" << endl;
    }
    cout << "After scope" << endl;
    return 0;
}
Output
Before scope
Logger created
Inside scope
Logger destroyed
After scope

Exact order dhyan rahe: destructor foran chalta hai jaise hi log apne enclosing block se bahar jaata hai, 'After scope' print hone se bhi pehle. Yahi core idea hai C++ ke har resource-managing type ke peeche — file handles, locks, aur is course mein baad mein cover hone wale smart pointers, sab isi mechanism par inhisar karte hain, na ke garbage collector ki indeterminate timing par.

Aage: encapsulation — access control, aur jab ek class ke paas protect karne ke liye invariants hon to fields ko private banana kyun matter karta hai.

Practice exercise

Ek class Counter define karein jiska constructor "Counter started" print kare aur jiska destructor "Counter finished" print kare. main mein ek Counter banayein, use banane ke baad "Running" print karein, phir use scope se bahar jaane dein.