#include using namespace std ; class student { public: int id ; student( ) { id=0 ; } student( int idP ) { id = idP ; cout << "Constructor called for ;" << id << endl ; } student( const student& obj1 ) { id = obj1.id ; cout << "Copy Constructor called for ;" << id << endl ; } ~student( ) { cout << "Destructor called for ;" << id << endl ; } }; template < typename T > class SP { private: T* pData; // Generic pointer to be stored int* referenceCount ; public: SP(T* pValue) : pData(pValue) { referenceCount = new int ; *referenceCount = 1 ; } SP( const SP& anotherSP_object ) { cout << "Copy constructor getting called. " << endl ; pData = anotherSP_object.pData ; referenceCount = anotherSP_object.referenceCount ; //Updates it in all the copies *referenceCount = *referenceCount + 1 ; } ~SP() { (*referenceCount)-- ; cout << "SP Destructor referenceCount: " << *referenceCount << endl ; if ( *referenceCount == 0 ) { delete pData ; delete referenceCount ; } } T& operator* () { return *pData; } T* operator-> () { return pData; } }; int main() { SP< student > per1(new student(1)); cout << per1->id << endl ; cout << (*per1).id << endl ; //Make a copy SP< student > per2 = per1 ; return 0 ; }