Bei C++ ist das etwas anders, als du es vielleicht von anderen Sprachen her kennst.
Zu Definition und Deklaration kommt nämlich noch die Initialisierung und zwar abhängig vom aktuellen Gültigkeitsbereich.
Der Einfachheit halber gehe ich im Folgenden mal davon aus, dass alle Deklarationen / Definitionen / Initialisierungen innerhalb einer Funktion, also z. B. main(), stattfinden ...
Beispiel mit Integern:
int i; // Deklaration + Definition
int i = 0; // Dekl. + Def. + Initialisierung
Bei Objekten ist das anders:
Dog dog; // Dekl. + Def. + Init.
Bei Zeigern ist es wieder so wie bei Integern:
Dog * ptr; // Dekl. + Def.
Dog * ptr = nullptr; // Dekl. + Def. + Init.
Wenn du auf Nummer sicher gehen willst, solltest du deine Variablen unabhängig vom Typ iMMER sofort initialisieren.
Dafür gibt es seit C++11 diese einheitliche Syntax:
int i {}; // Dekl. + Def. + Init.
Dog dog {}; // Dekl. + Def. + Init.
Dog * ptr {}; // Dekl. + Def. + Init.
Falls das jetzt noch verwirrend für dich ist, wovon ich ausgehe und was am Anfang absolut normal ist, dann liegt das einfach daran, dass dir noch einige Information fehlen, die jetzt hier aber auch den Rahmen sprengen würden.
Mach dir einfach keine Gedanken, und lerne immer ordentlich weiter mit deinem Tutorial, Buch, Lehrer, wasauchimmer ...
Viel Erfolg! :)