Zum Inhalt springen
C++ Anfรคnger 20 min

Dein erstes C++-Programm

Der Aufbau einer .cpp-Datei: main, include, namespaces, I/O mit iostream und wie du modernes C++ statt altem Stil schreibst.

Aktualisiert:
Inhaltsverzeichnis

Dein erstes C++-Programm

C++ hat ein paar Eigenheiten, die aus seinen C-Wurzeln stammen. Schauen wir uns ein vollstaendiges Programm an und verstehen jedes Detail.

Das minimale Programm

#include <iostream>

int main() {
    std::cout << "Hallo, C++!\n";
    return 0;
}

#include <iostream>

Das ist eine Preprocessor-Direktive. Sie sagt dem Compiler: โ€œNimm den Inhalt der Header-Datei iostream hier rein.โ€

  • <iostream> enthaelt std::cout fuer Konsolen-Ausgabe
  • Andere haeufige Header: <string>, <vector>, <map>, <algorithm>

int main()

Jedes C++-Programm braucht eine main-Funktion. Sie ist der Einstiegspunkt.

  • Der Rueckgabetyp ist int (Exit-Code: 0 = OK, alles andere = Fehler)
  • return 0; am Ende signalisiert Erfolg (kann man sogar weglassen - C++ macht das automatisch)

std::cout << ...

  • std ist der Namespace der Standard-Library
  • std::cout ist der โ€œcharacter output streamโ€ (Konsolen-Ausgabe)
  • << ist der Output-Operator - du kannst ihn โ€œkettenโ€

"\n" oder std::endl

  • "\n" ist ein einfacher Zeilenumbruch
  • std::endl ist Zeilenumbruch plus Flush des Buffers (langsamer, selten noetig)

Empfehlung: "\n" nutzen, ausser du brauchst den Flush.

using namespace std; - bitte nicht

Du wirst oft diesen Code sehen:

using namespace std;
cout << "Hallo!\n";

Das ist nicht empfohlen. Der std::-Praefix macht klar, woher der Name kommt. Ohne Praefix kann es Namenskonflikte geben, wenn du mehrere Libraries nutzt.

Besser: Einzelne Namen importieren, wenn noetig:

using std::cout;
using std::cin;

Variablen und Ausgabe

#include <iostream>
#include <string>

int main() {
    std::string name = "Anna";
    int alter = 28;
    double pi = 3.14159;

    std::cout << "Name: " << name << "\n";
    std::cout << "Alter: " << alter << "\n";
    std::cout << "Pi: " << pi << "\n";
}

Der <<-Operator wandelt automatisch Zahlen, Strings, etc. in Text um.

Eingabe mit std::cin

#include <iostream>
#include <string>

int main() {
    std::string name;
    std::cout << "Wie heisst du? ";
    std::getline(std::cin, name);

    std::cout << "Hallo, " << name << "!\n";
}
  • std::getline(std::cin, name) liest eine komplette Zeile
  • std::cin >> name wuerde nur bis zum ersten Leerzeichen lesen

Zahlen einlesen

int alter;
std::cout << "Dein Alter: ";
std::cin >> alter;

std::cout << "Mit " << alter << " Jahren...\n";

std::format (C++20) und fmt

std::format ist Pythons f-Strings aehnlich:

#include <format>
#include <iostream>

int main() {
    std::string name = "Anna";
    int alter = 28;

    std::cout << std::format("Hallo, {}! Du bist {} Jahre alt.\n", name, alter);
}

Nicht alle Compiler unterstuetzen <format> komplett. Alternativ die ausgezeichnete fmt-Library:

#include <fmt/core.h>

fmt::print("Hallo, {}! Du bist {} Jahre alt.\n", name, alter);

auto - Typ-Inferenz

auto name = std::string{"Anna"};  // std::string
auto alter = 28;                   // int
auto pi = 3.14;                    // double
auto zahlen = std::vector<int>{1, 2, 3};

auto macht Code lesbarer, besonders bei komplexen Typen:

// Alt:
std::map<std::string, std::vector<int>>::iterator it = meineMap.begin();

// Modern:
auto it = meineMap.begin();

Range-for

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> namen = {"Max", "Anna", "Leo"};

    for (const auto& name : namen) {
        std::cout << "Hallo, " << name << "!\n";
    }
}
  • const auto& uebernimmt keine Kopie, kann nicht veraendern
  • auto& uebernimmt keine Kopie, kann veraendern
  • auto macht eine Kopie

Kommentare

// Einzeiliger Kommentar

/*
 Mehrzeiliger
 Kommentar
 */

Kompilieren und laufen

g++ -std=c++23 -Wall -Wextra -O2 hallo.cpp -o hallo
./hallo

Mit CMake (siehe vorheriges Kapitel) wird das im Laufe der Zeit angenehmer, sobald dein Projekt waechst.

Ein kompletteres Beispiel

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main() {
    std::vector<std::string> namen = {"Max", "Anna", "Leo", "Ti"};

    // Alle Namen ausgeben
    for (const auto& name : namen) {
        std::cout << name << "\n";
    }

    // Filter nach Laenge
    std::cout << "\nLange Namen:\n";
    for (const auto& name : namen) {
        if (name.size() > 3) {
            std::cout << "  " << name << "\n";
        }
    }

    // Sortieren
    std::sort(namen.begin(), namen.end());
    std::cout << "\nSortiert:\n";
    for (const auto& name : namen) {
        std::cout << "  " << name << "\n";
    }
}

Mehrere Dateien

Sobald dein Programm waechst, teilst du es in Header (.h / .hpp) und Source (.cpp) auf:

math_utils.hpp:

#pragma once

int addiere(int a, int b);

math_utils.cpp:

#include "math_utils.hpp"

int addiere(int a, int b) {
    return a + b;
}

main.cpp:

#include <iostream>
#include "math_utils.hpp"

int main() {
    std::cout << addiere(3, 4) << "\n";
}

Kompilieren:

g++ -std=c++23 main.cpp math_utils.cpp -o app

Oder ueber CMake.

Zusammenfassung

  • #include <...> bringt Header-Dateien herein
  • int main() ist der Einstiegspunkt
  • std::cout << ... fuer Ausgabe, std::cin >> ... / std::getline fuer Eingabe
  • Kein using namespace std; - lieber std:: ausschreiben
  • auto fuer Typ-Inferenz, range-for fuer Iteration
  • .hpp-Header plus .cpp-Source trennen den Code in Uebersetzungseinheiten

Im naechsten Kapitel: Variablen, Datentypen und Typen im Detail.

Zurรผck zum C++ Kurs