Aloha :)
Die Methode void printCar(const Car &car) ist falsch deklariert, sie müsste einfach nur als void printCar() deklariert sein. Du rufst die Methode ja für ein Auto auf, indem du c2.printCar() schreibst. Das Objekt c2 wird der Methode printCar() dann als "internes Objekt" übergeben. Genau genommen erhält die Methode printCar() einen Zeiger auf das Objekt c2. Diesen Zeiger kannst du mit dem Schlüsselwort this innerhalb der Methode verwenden, um auf die Member-Variablen des Objektes zugreifen zu können. Ganz exakt müsste deine Methode so aussehen:
void printCar() {
std::cout << this->brand << ":" << this->ps << endl;
}
Mit dem Aufruf c1.printCar() zeigt der this-Zeiger auf das Objekt c1. Mit dem Aufruf c2.printCar() zeigt der this-Zeiger auf das Objekt c2. Da C++ aber eine Sprache ist, die viel vor dem Entwickler versteckt, kannst du das this-> vor den Member-Variablen auch einfach weglassen. C++ ergänzt das dann automatisch. In diesem Fall sähe die Methode dann genau so aus, wie du sie definiert hast:
void printCar() {
std:cout << brand << ":" << ps << endl;
Das von dir erwähnte "using namespace std" sorgt nur dafür, dass der Namensraum std in deiner CPP-Datei sichtbar wird. Dadurch kannst du dann beim Aufruf von std::cout das std:: davor auch weglassen.