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.
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>enthaeltstd::coutfuer 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 << ...
stdist der Namespace der Standard-Librarystd::coutist der โcharacter output streamโ (Konsolen-Ausgabe)<<ist der Output-Operator - du kannst ihn โkettenโ
"\n" oder std::endl
"\n"ist ein einfacher Zeilenumbruchstd::endlist 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 Zeilestd::cin >> namewuerde 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 veraendernauto&uebernimmt keine Kopie, kann veraendernautomacht 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 hereinint main()ist der Einstiegspunktstd::cout << ...fuer Ausgabe,std::cin >> .../std::getlinefuer Eingabe- Kein
using namespace std;- lieberstd::ausschreiben autofuer 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.