Chris Codeblog

Tipps, Tricks & Tutorials rund ums Programmieren

[C++] Ein paar C++11 Features vorgestellt

Heute möchte ich euch ein paar nette Features des C++11 Standards vorstellen. Wie schon am Anfang erwähnt möchte ich nach und nach Beiträge die ich zum Thema Programmierung geschrieben habe aus chris-blog.com übernehmen. Dies ist einer davon.

Initialisieren

Eine kleine aber nette Änderung ist die Initialisierung in der Header-Datei, so muss man nicht sämtliche Variablen im Konstruktor initialisieren:

class Foo
{
    private:
        String strVorname = "Max";
        String strName = "Mustermann";
}
auto

Als nächstes sehen wir uns das Auto-Keyword an. Damit muss ein Datentyp nicht mehr extra angegeben werden, sondern der Compiler ermittelt diesen selbst. So ergibt sich in folgendem Beispiel in der ersten Zeile ein Integer, in der zweiten Zeile ein double und in der dritten Zeile ein String:

auto i = 1;
auto db = 10.5;
auto str = "Foo";

Interessanter wird das auto-Keyword allerdings in Kombination mit Lambda-Funktionen und Vectoren.

Lambda-Funktionen

Was ist eine Lambda-Funktion? Eine Lambda-Funktion ist eine anonyme Funktion, die Innerhalb einer anderen Funktion deklariert werden kann. So kann man leicht Hilfsfunktionen basteln, die man nur in einer bestimmten Funktion braucht. Um diese aber einfach zu verwenden müsste man sich einen Funktionszeiger deklarieren. Das würde dann in etwa so aussehen:

typedef void(FunctionPointer)(std::string);
FunctionPointer *p;
// Hier wird eine Lambdafunktion erzeugt und dem Funktionszeiger "p" zugewiesen
p = [](String strName) -> void { std::cout << "Hello " << strName.c_str(); };
p("Christian");

Im obigen Beispiel wurde ein Funktionszeiger definiert (FunctionPointer). Für diesen Typ wurde die Variable p erzeugt. Dieser Variable wurde dann die Lambda-Funktion übergeben.

So wie die Lambda-Funktion oben steht, kann man aber auf Variablen die außerhalb liegen nicht zugreifen. Möchte man aber z. B. auf eine Variable die im selben Scope liegt zugreifen, kann man die äußeren Werte übernehmen. Dazu dient die eckige Klammer:

[=] – die äußeren Variablen sind in der Lambda-Funktion als Kopie vorhanden
[&] – die äußeren Variablen sind in der Lambda-Funktion als Referenz vorhanden

Außerdem kann man nur einzelne Variablen übernehmen oder beide Arten kombinieren:
[&, =db] – alle Werte werden per Referenz übernommen, außer db, dieser Wert wird als Kopie übernommen.

Nachdem man festgelegt hat welche Variablen wie übernommen werden sollen, kommen in normalen Klammern die Übergabeparameter. Mit einem -> Datentyp wird der Rückgabewert angegeben, welcher im Fall von void auch weggelassen werden kann. Danach kommt in geschweiften Klammern der auszuführende Code.

Wie gesagt muss man mit dem auto-Keyword auch den Funktionszeiger nicht mehr selber definieren. Hier also obige Funktion in „Minimalausführung“:

auto p = [](String strName) { std::cout << "Hello " << strName.c_str(); };
p("Christian");

Vector
Als letztes werfen wir noch einen kurzen Blick auf Vectoren in Kombination mit dem auto-Keyword. Wenn man davon ausgeht das man einen Vector vom Typ String hat, sah die Iteration bisher so aus:

for(std::vector<String>::const_iterator cit = vec.begin(); cit != vec.end(); ++cit)
    std::cout << (*cit).c_str() << std::endl;

Die Schleife lässt sich nun schonmal wie folgt abkürzen:

for(String str : vec)
    std::cout << str.c_str() << std::endl;

Als letztes kombinieren wir die Schleife noch mit dem auto-Keyword:

for(auto str : vec)
    std::cout << str << std::endl;
[C++] Ein paar C++11 Features vorgestellt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen