Dann legen wir mal los 😀
Zur Erinnerung: C++ ist ein Superset von C
Der Funktionsumfang von C ist (größtenteils) in C++ abgebildet
→ Kein Zwang, andere Funktionen/Konzepte als bisher zu verwenden
Wichtig: Der C++-Standard ist riesig
Pragmatische Lösung: Verwendung der benötigten/bevorzugten Komponenten
→ Rest ignorieren 😀
Wir schauen uns jetzt einmal das Notwendigste an
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
}
.hprintf() jetzt std::cout (über Outputstreams)std::?Zugriff auf Komponenten des Namespaces mit dem Scope Resolution Operator → ::
Daher auch Präfix std → Zugriff auf Namensraum std
std entspricht C++-Standardbibliothek
Anmerkung: Es gibt auch den globalen Namespace
:: als Präfix (→ ::x)#include <iostream>
int k = 4711;
namespace A {
double d = 3.5;
void print(double d) {
std::cout << d << std::endl;
}
}
namespace B {
int i = 1;
void print(int i) {
std::cout << i << std::endl;
}
}
int main() {
A::print(A::d);
B::print(B::i);
B::print(::k);
return 0;
}
#include <iostream>
namespace A {
int i = 0;
namespace B {
int add(int num1, int num2) {
return num1 + num2;
}
}
namespace C {
int j = 2;
}
}
int main () {
std::cout << A::B::add(A::i, A::C::j) << std::endl;
return 0;
}
(Namenräume können über mehrere Dateien verteilt sein → siehe std)
using!→ Beispiel: using namespace std
using namespace stdAchtung: Viele (schlechte) Tutorials verwenden leider using namespace std! Nehmt euch die Zeit, das auszuschreiben. Es erspart auf lange Sicht Qualen.
printf() gibt es in C++ einen neuen Mechanismus: Outputstreamsstd::cout<<std::endlstd::hex, um alle folgenden Zahlen hexadezimal darzustellen#include <iostream>
int main() {
bool b = true;
int i = 42;
std::cout << "1: \t" << b << std::endl;
std::cout << std::boolalpha; // Uminterpretierung von bool
std::cout << "true: \t" << b << std::endl;
std::cout << std::noboolalpha; // Revertierung
std::cout << "1: \t" << b << std::endl;
std::cout << "Dec: \t" << i << std::endl; // Default ist std::dec
std::cout << std::hex;
std::cout << "Hex: \t" << i << std::endl;
std::cout << std::oct;
std::cout << "Oct: \t" << i << std::endl;
}
(Eine Liste aller Manipulator-Flags ist hier verlinkt)
std::cin>>std::printstd::print()printf() mit Nützlichkeit von OutputstreamsBereits bekannte Form: stdio.h
Version für C++: cstdio
Mit Präfix c, ohne Suffix .h
std → std::printf;& ersetzt Zeigerstern *#include <iostream>
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 1, b = 2;
std::cout << "A: " << a << ", B: " << b << std::endl;
swap(a, b);
std::cout << "A: " << a << ", B: " << b << std::endl;
}
int add1(int i, int j, int k = 2); // Ok
int add2(int i, int j = 1, int k = 2); // Ok
int add3(int i = 0, int j = 1, int k = 2); // Ok
int add4(int i = 0, int j, int k = 2); // Error, falsche Reihenfolge
add3(); // Rückgabe: 3
add3(1); // Rückgabe: 4
add3(1,4); // Rückgabe: 7
add3(1,2,3); // Rückgabe: 6In C++ codiert der Symbolname u. a. Parameter 💡
Codiert u. a. Namensraum, Rückgabewert, Funktionsnamen, Parameter und deren Typen in Symbolname
→ C++ Name Mangling
extern "C"
(Das C-Namensschema ist allgemein sehr einfach und wird deswegen für die Interoperabilität zwischen verschiedenen Programmiersprachen sehr oft verwendet.)
Markieren einzelner Funktionen/Blöcke
Entfernen des Name Manglings für Header
char * bzw. char [] in Klassec_str()size() → Gibt Größe ausstd::string bietet einige Vorteile
str += " World";In C++ gibt es eine Abstraktion der bereits bekannten for-Schleifen:
Range-based for-loops
Gedacht als Tipperleichterung für komplexere Daten-Container wie std::vector (kommt gleich)
Vorteil: Es muss nicht mehr auf die Indizes geachtet werden
Erreicht dies unter der Haube über sogenannte Iteratoren (hier nicht weiter Thema)
#include <string>
#include <iostream>
using std::cout, std::endl;
int main() {
std::string str = "Hello World";
for (char c: str) {
// Print every character
cout << c;
}
cout << endl;
}
conststd::vector kapselt Eigenschaften eines Feldes[], kann beliebige Datentypen aufnehmen und dynamische Größe 🤯
at(), da [] bei falschem Index undefiniert ist#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
nums.push_back(3);
nums.push_back(42);
nums.push_back(-1);
nums[2] += 10;
for (const int & i : nums) {
std::cout << i << " ";
}
std::cout << std::endl;
for (size_t i = 0; i < nums.size(); ++i) {
std::cout << nums.at(i) << " ";
}
std::cout << std::endl;
return 0;
}
std::string und std::vector