#include using namespace std; class SomeDataT { public: SomeDataT() { cout << "Constructor called " << endl; } ~SomeDataT() { cout << "Destructor called " << endl; } void Data(int newData) { data = newData; } int Data() const { return data; } private: int data{4}; }; int main() { // a demonstration of references int a {100}; int & b{a}; int * c{& a}; // int * c = &a; cout << " int a {100}" << endl; cout << " int & b{a}" << endl; cout << " int * c{& a}" << endl; cout << " & a " << &a << endl; cout << " & b " << &b << endl; cout << " & c " << &c << endl; cout << endl; cout << " a = " << a << " b = " << b << " *c = " << *c << " c = " << c << endl << endl; cout << "executing a = 42 " << endl; a = 42; cout << " a = " << a << " b = " << b << " *c = " << *c << " c = " << c << endl << endl; cout << "executing b = 99 " << endl; b = 99; cout << " a = " << a << " b = " << b << " *c = " << *c << " c = " << c << endl << endl; cout << "executing *c = 22 " << endl; *c = 22; cout << " a = " << a << " b = " << b << " *c = " << *c << " c = " << c << endl << endl; //cout << "executing c = 10 " << endl; // c = 10; // will not compile //c = static_cast(10); // will not compile //c = reinterpret_cast(10); // will compile but will crash. // //cout << " a = " << a << " b = " << b << " *c = " // << *c << " c = " << c << endl << endl; // //cout << " c = " << c << endl; //cout << " *c = " << *c << endl; int d{100}; c = &d; cout << "&d = " << &d << endl; cout << "c = " << c << endl; cout << " a = " << a << " b = " << b << "d = " << d << endl; b = d; cout << " a = " << a << " b = " << b << "d = " << d << endl; cout << " &a = " << &a << " &b = " << &b << "&d = " << &d << endl; SomeDataT * ptr{nullptr}; ptr = new SomeDataT; cout << "The data is " << ptr->Data() << endl; // I am putting this in a code block because I don't want to reference // the data after it has been deleted. { SomeDataT & ptrRef {*ptr}; cout << "The data is also " << ptrRef.Data() << endl; } delete ptr; ptr = nullptr; return 0; }