Passing objects to functions safely and efficiently
It doesn't feel natural to initialize a Doge with a fixed age:


Doge::Doge(){
    cout &lt;&lt; "Doge Constructor" &lt;&lt; endl;
    itsAge = 5;
}



It would be more natural to make age a mandatory constructor parameter:

Doge::Doge(int itsAge): itsAge(itsAge) {
    std::cout &lt;&lt; "Doge Constructor" &lt;&lt; std::endl;
}




The copy constructor doesn't actually copy anything.
Either remove it, or implement copying, for example:

Doge::Doge(Doge&amp; other){
    std::cout &lt;&lt; "Doge Copy Constructor" &lt;&lt; std::endl;
    this-&gt;itsAge = other.itsAge;
}




This function is declared to return a Doge *, but it returns nothing:


Doge * Function( Doge * theDoge){
    cout &lt;&lt; "In Function" &lt;&lt; endl;
    cout &lt;&lt; "Scott is now " &lt;&lt; theDoge-&gt;GetAge() &lt;&lt; endl;
}



This raises a compiler warning, at least with g++.



You probably implemented the destructor just to see when it gets called.
That's fine, for testing.
When you're done, just remember to remove it if it's not needed.