C++ Grundinfos

Diese Seite stellt grundlegende Daten rund um die Programmiersprache C++ bereit. Sie ist eher für Menschen mit Vorkenntnissen geeingnet.

Auszug Wikipedia:

C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau. Der Standard definiert auch eine Standardbibliothek, zu der verschiedene Implementierungen existieren.

Es muss ein Compiler installiert sein. Oder es gibt auch Online-Compiler

Grundsätzlich gilt für die Programmierung in C++, dass die Sprache case sensitive ist, also zwischen Groß- und Kleinschreibung unterscheidet. Der C++-Compiler lässt eine formatfreie Eingabe des Quellcodes zu – anders als bei Python

Ablauf der Erstellung eines Programms:

  • Datei erstellen und bearbeiten
  • Dateiendung ist .cpp
  • Ausführung mit dem Compiler z.B : g++ hello.cpp (Kommandozeile: gcc für C, g++ für C++)
  • Es wird automatisch eine Datei namens a.out erstellt.
  • Die Datei ausführbar machen chmod +x a.out
  • Dann kann die Datei ausführt werden: ./a

Bei der Erstellung eines C++-Programms werden verschiedene Dateitypen verwendet, die unterschiedliche Funktionen erfüllen:

  1. Quelldateien (.cpp):
  • Enthalten den eigentlichen C++-Quellcode
  • Beinhalten Funktionsdefinitionen, Klassendefinitionen und die main()-Funktion
  • Werden vom Compiler in Objektdateien übersetzt
  1. Headerdateien (.h oder .hpp):
  • Enthalten Deklarationen von Funktionen, Klassen und Variablen
  • Werden in Quelldateien mit #include eingebunden
  • Ermöglichen die Trennung von Schnittstelle und Implementierung
  1. Objektdateien (.o oder .obj):
  • Vom Compiler erzeugte Zwischendateien
  • Enthalten kompilierten Maschinencode, aber noch keine ausführbare Datei
  • Werden vom Linker zu einer ausführbaren Datei zusammengefügt
  1. Ausführbare Datei (.exe unter Windows, kein Suffix unter Unix/Linux):
  • Das fertige, ausführbare Programm
  • Vom Linker aus Objektdateien erzeugt
  1. Projektdateien (.pro für Qt-Projekte):
  • Beschreiben die Struktur des Projekts
  • Enthalten Informationen über Quell- und Headerdateien, Bibliotheken und Kompilierungsoptionen
  1. Makefile:
  • Beschreibt, wie das Programm zu kompilieren und zu linken ist
  • Wird oft automatisch generiert (z.B. durch qmake aus einer .pro-Datei)
  1. Bibliotheksdateien (.lib, .a, .dll, .so):
  • Enthalten vorkompilierten Code, der von mehreren Programmen genutzt werden kann
  • Statische (.lib, .a) oder dynamische (.dll, .so) Bibliotheken

Diese verschiedenen Dateitypen spielen zusammen, um den Entwicklungsprozess zu strukturieren, die Wiederverwendbarkeit von Code zu erhöhen und die Kompilierung und Ausführung des Programms zu ermöglichen.

Weitere grundlegende Infomationen

  • Jede Anwendung wird mit einem Semikolon beendet
  • Kommentare, es gibt in C++ 2 verschiedene Varianten , Kommentare zu setzen.
  • Die erste Variante behandelt alles nach // bis zum Zeilenende als Kommentar, der vom Compiler einfach ignoriert wird. Bei der 2. Variante wird alles zwischen /* und */ über mehrere Zeilen als Kommentar behandelt, und vom Compiler ignoriert.
  • die Sprache ist case sensitive
  • Die Anweisung import std; oder import std.compat; importiert die Standardbibliothek in Ihre Anwendung.
  • Entweder wird die Bibliothek std importiert oder std:: muss vor die Aufgaben eingefügt werden. Also zum Beispiel: using namespace std und cout oder cout std::cout

Ein einfaches Programm um zu testen, ob die Umgebung funktioniert:

#include <iostream>

using namespace std;

int main()
{
   cout << "Hello World";

   return 0;
} 

Unter Windows wird sich das Programm wahrscheinlich sofort wieder schließen, das kann man umgehen, indem man in die Kommandozeile (Start->Ausführen-> cmd eingeben) geht, dort zum Directory geht, und das Programm dann manuell startet. Es sollte Hello World auf dem Bildschirm erscheinen, wenn nicht hast du ein Problem mit dem Compiler/der IDE, frag im C++ Forum wie man ihn bedient.

zusätzliche Funktionen werden wie folgt definiert:

Datentyp Name_der_Funktion (Abhängigkeiten)
{
Funktionsaufgaben
}

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

Befehlsabfolgen werden mit einem Semikolon beendet
Anweisungsblöcke mit geschweiften Klammern umgeben.
Die Datei muss kompiliert werden:

g++ alter.cpp -o alter

Erklärung:

-o alter gibt an, dass die ausführbare Datei „alter“ heißen soll

g++ ist der C++-Compiler

alter.cpp ist Ihre Quelldatei

Erste Schritte:

Importieren der Ein- und Ausgabe:

#include <iostream>

Eine Hauptfunktion muss vorhanden sein. Die Definition geht über int main( ){ }

int main ( ) 
{
//hier kommt der Code herein
}

Ein Kommentar wird mit // einzeilig oder /* */ mehrzeilig festgelegt

// Ein einzeiliger Kommentar
/* Ein Kommentar, der sich
über mehrere Zeilen erstreckt */

Zeilenumbruch:
Sie können die Escape-Sequenz \n in die Zeichenkette einfügen oder den Manipulator endl (für end-line) benutzen

Definition einer Variable erfolgt über typ variablenname = wert

// Ganzzahl
int zahl = 5;
// Kommazahl
float kommazahl = 0.5f;
// Zeichenkette
string zeichenkette = "Hallo!";
// Zeichen oder char
char buchstabe = 'D';
// Wahrheitswert
bool wahrheitswert = true;

Das std:: in C++ hat folgende Bedeutung:

  1. Es ist ein Namensraum (namespace) der C++-Standardbibliothek.
  2. std steht für „standard“ und enthält alle Funktionen, Klassen und Objekte der C++-Standardbibliothek.
  3. Der doppelte Doppelpunkt :: ist der Scope-Resolution-Operator, der verwendet wird, um auf Elemente innerhalb eines Namensraums zuzugreifen.
  4. Durch die Verwendung von std:: vor einem Bezeichner (z.B. std::cout) wird dem Compiler mitgeteilt, dass dieser Bezeichner aus dem std-Namensraum stammt.
  5. Es hilft, Namenskonflikte zu vermeiden, indem es die Standardbibliothekselemente von benutzerdefinierten Elementen trennt.
  6. Alternativ zur Verwendung von std:: vor jedem Standardbibliothekselement kann man using namespace std; am Anfang des Codes verwenden, was jedoch in größeren Projekten als schlechte Praxis gilt.
  7. Eine bessere Alternative ist die Verwendung spezifischer using-Deklarationen wie using std::cout;, um nur bestimmte Elemente aus dem std-Namensraum verfügbar zu machen.

Die Verwendung von std:: erhöht die Lesbarkeit des Codes und macht deutlich, welche Elemente zur Standardbibliothek gehören

std::cin

Das cin-Objekt ist eine Instanz der istream-Klasse. Es liest Eingaben vom Eingabegerät, der Tastatur. Es wird normalerweise zusammen mit der Extraktion verwendet operator (>>). Das Extraktionsobjekt ist für das Extrahieren der über die Tastatur eingegebenen Daten aus dem Cin-Objekt verantwortlich.

std :: cout

Das cout-Objekt ist eine Instanz der iostream-Klasse. Es wird für die Ausgabe auf einem Standardausgabegerät verwendet, bei dem es sich normalerweise um den Bildschirm handelt. Es wird zusammen mit der Stream-Einfügung verwendet operator (<<).

#include <iostream>

int main() {
  int zahl1;
  int zahl2;
  int ausgabe; // Deklaration der Variable "ausgabe"

  // Einlesen der Zahlen
  std::cout << "Bitte gib die erste Zahl ein: ";
  std::cout << std::endl;
  std::cin >> zahl1;

  std::cout << "Bitte gib die zweite Zahl ein: ";
  std::cin >> zahl2;
  std::cout << std::endl;

  // Berechnung der Summe und Speicherung in "ausgabe"
  ausgabe = zahl1 + zahl2;

  // Ausgabe des Ergebnisses
  std::cout << "Die Summe ist " << ausgabe << std::endl;

  return 0;
}

return 0; beendet das Programm

std::clog

Das Clog-Objekt ist eine Instanz der Ostream-Klasse. Es dient dazu, Fehler auf der Standardanzeige, dem Monitor, anzuzeigen.

Wenn die Bibliothek importiert wird muss kein std:: mit angegeben werden. Bsp:

Wenn du die using namespace std;-Anweisung am Anfang deines Programms hast, kannst du std::cout weglassen. Andernfalls musst du std::cout verwenden, um den Gültigkeitsbereich (namespace) von cout anzugeben.

Der Punkt (.) vor dem Dateinamen hallo ist wichtig, da er dem System mitteilt, dass es sich um eine ausführbare Datei im aktuellen Verzeichnis handelt. Wenn du den Befehl ./hallo ausführst, sollte dein Programm starten und die erwartete Ausgabe auf dem Terminal anzeigen. Hier sind einige zusätzliche Hinweise:

Stelle sicher, dass du die Ausführungsrechte für die Datei hallo hast. Wenn nicht, kannst du den Befehl chmod +x hallo verwenden, um die Ausführungsrechte zu erteilen.
Wenn du dich in einem anderen Verzeichnis befindest, musst du den vollständigen Pfad zur ausführbaren Datei angeben, z.B. /pfad/zum/verzeichnis/hallo.
Unter Linux ist es üblich, dass ausführbare Dateien keine Dateiendung wie .exe haben. Der Name hallo ohne Endung ist daher korrekt.
Wenn du Probleme bei der Ausführung hast, überprüfe die Ausgabe des Kompiliervorgangs auf Fehler- oder Warnmeldungen und behebe diese gegebenenfalls.

Arbeiten mit Strings

#include <iostream> // Für Ein- und Ausgabe
#include <string>   // Für die string-Klasse

int main() {
    std::string name; // Definition der Variable als String
    std::cout << "Wie heissen Sie? ";  
    // std::cout << std::endl; // Diese Zeile ist optional und kann entfernt werden - Zeilenumbruch

    std::cin >> name; // Variableneingabe einlesen

    std::cout << "Hallo " << name << std::endl; // Korrigierte Syntax

    return 0; // Programm beenden
}


Eine einfache if / else Abfrage:

#include <iostream>
#include <string>

int main(){

	int alter;
        std::cout << "Wie alt sind Sie?";
        std::cin >> alter;
        if (alter > 17){
                std::cout << "Sie sind erwachsen";
        }
	else {
              	std::cout << "Du bist noch nicht erwachsen";
        }
return 0;
}

Eine einfache while Schleife:

Es werden die Zahlen von 1-100 ausgegeben:

Eine For-Schleife mit der Ausgabe von 1-19

#include <iostream>
//using namespace std;
int main(){

for (int i=0; i<20; i++) {
        std::cout << i; 
        }
}

Erklärung

  1. Zunächst müssen wir die Header-Dateien iostream und string einbinden, um die Standardeingabe/-ausgabe (std::cout, std::endl) und die Zeichenkettenklasse (std::string) verwenden zu können.
  2. In der main()-Funktion deklarieren wir eine Zeichenkettenvariable str und initialisieren sie mit dem Wert "hallo".
  3. Wir verwenden eine for-Schleife, um den String 19 Mal auszugeben. Die Schleifenvariable i wird mit 0 initialisiert und läuft solange, wie i kleiner als 19 ist.
  4. Innerhalb der Schleife geben wir den Wert von str mit std::cout << str << std::endl; aus. Der Ausdruck std::endl sorgt dafür, dass nach jeder Ausgabe ein Zeilenumbruch erfolgt.
  5. Nach der Schleife gibt die main()-Funktion den Wert 0 zurück, um anzuzeigen, dass das Programm erfolgreich ausgeführt wurde.

Replace

#include <iostream>
#include <string>


int main()
{
    std::string eingabe;
    std::cout << "Bitte den Text eingeben: ";
    std::getline(std::cin, eingabe);
    eingabe = eingabe.replace(eingabe.find("sc"), 2, "fM");
    std::cout << "Die Übersetzung ist: " << eingabe << std::endl;
    return 0;
}

Die Syntax der replace-Funktion, die Sie in Ihrem Beispiel verwenden, ist eine spezifische Variante der std::string::replace Methode in C++. Hier ist eine Erklärung der Syntax:

eingabe.replace(eingabe.find("sc"), 2, "fM")

Aufbau der replace-Funktion

Die replace-Funktion hat folgende Struktur:

string.replace(pos, len, str)
  • pos: Die Startposition, an der ersetzt werden soll.
  • len: Die Anzahl der zu ersetzenden Zeichen.
  • str: Der String, der eingesetzt werden soll.

Erklärung der Komponenten

  1. eingabe.find("sc"): Sucht nach dem ersten Vorkommen von „sc“ im String eingabe und gibt die Position zurück.
  2. 2: Die Länge des zu ersetzenden Teilstrings („sc“ hat zwei Zeichen).
  3. "fM": Der neue String, der anstelle von „sc“ eingesetzt wird.

Funktionsweise

  • Die Methode ersetzt ab der gefundenen Position (eingabe.find("sc")) zwei Zeichen (2) durch den String "fM".
  • Falls „sc“ nicht gefunden wird, wird keine Ersetzung vorgenommen.
  • Die Funktion gibt einen Verweis auf den modifizierten String zurück, daher die Zuweisung eingabe = ....

Wichtige Hinweise

  • Diese Methode ersetzt nur das erste Vorkommen von „sc“.
  • Wenn Sie alle Vorkommen ersetzen möchten, müssen Sie eine Schleife verwenden[4].
  • Die Funktion ist case-sensitive, d.h. sie unterscheidet zwischen Groß- und Kleinschreibung.

Qt Resource File

  1. Eine .qrc-Datei ist eine XML-Datei, die Qt-Ressourcen beschreibt. Sie muss zuerst in C++-Code umgewandelt werden, bevor sie kompiliert werden kann.
  2. Wenn Sie ein Qt-Projekt haben, sollten Sie qmake verwenden, um ein Makefile zu generieren, das die korrekte Verarbeitung der .qrc-Datei handhabt.
  3. Wenn Sie kein vollständiges Qt-Projekt haben, können Sie das rcc-Tool verwenden, um die .qrc-Datei in C++-Code umzuwandeln:
   rcc -o test_rc.cpp test.qrc
  1. Danach können Sie die generierte .cpp-Datei zusammen mit Ihren anderen Quelldateien kompilieren:
   g++ test_rc.cpp test.cpp -o test $(pkg-config --cflags --libs Qt5Core Qt5Gui)

Ersetzen Sie „test.cpp“ durch Ihre tatsächliche Hauptquelldatei.

  1. Stellen Sie sicher, dass Sie die Qt-Entwicklungspakete installiert haben. Auf vielen Linux-Systemen können Sie dies mit einem Befehl wie sudo apt-get install qt5-default (für Ubuntu/Debian) oder sudo dnf install qt5-devel (für Fedora) tun. Unter Gentoo sind folgende Pakete erforderlich:
   qmake
   make

Dies setzt voraus, dass Sie eine .pro-Datei haben, die Ihr Projekt beschreibt.

Listet und vergleicht alle C++ Standards : https://de.cppreference.com/w