Neuerungen in C++11

Gunnar Beutner —  06.09.2012 — Leave a comment

C++ ist eine der beliebtesten Programmiersprachen und wird vor allem für komplexe Software-Projekte verwendet, wenn Performance wichtig ist.

Um die Sprache einfacher verständlich und einsatzfähig zu machen, wurde 2011 vom zuständigen ISO-Gremium die neue Version C++11 veröffentlicht, an der bereits seit 2005 gearbeitet wurde.

Eine der meiner Meinung nach wichtigsten Änderungen ist dabei die Unterstützung von Type Inference. Dieses Feature ermöglicht es, Variablen zu deklarieren, ohne ihren genauen Typ angeben zu müssen. Der Compiler erkennt hierbei anhand von dem Initialisierungs-Ausdruck, welchen Typ eine Variabel hat. Dies macht z.B. die Verwendung von STL-Containern einfacher:

Mit C++98:

map::iterator it = m.begin();

Mit C++11:

auto it = m.begin();

Zusammen mit den neuen Range-based For-Loops wird dieses Feature noch mächtiger:

Vorher:

vector::iterator it;
for (it = v.begin(); it != v.end(); it++) {
  ...
}

Nachher:

for (auto i : v)
  ...
}

Die C++-Standard-Library bietet für viele Algorithmen eine Implementation an, z.B. zum Filtern oder Durchsuchen von Listen. Hierfür musste jedoch bisher eine Funktion als Callback übergeben werden, z.B.:

bool compare_numbers(int a, int b)
{
  if (a % 2 == 0 && b % 2 == 0)
    return a < b;
  else
  return (a % 2 == 0);
}

int main(int argc, char **argv)
{
  vector numbers = { 4, 3, 2, 7 };

  sort(numbers.begin(), numbers.end(), compare_numbers);

  for (int i : numbers)
    cout << i << endl;

  return 0;
}

C++11 bringt Unterstützung für Lambda-Ausdrücke, wie sie bereits aus anderen Sprachen wie z.B. Python bekannt sind:

int main(int argc, char **argv)
{
  vector numbers = { 4, 3, 2, 7 };

  sort(numbers.begin(), numbers.end(), [](int a, int b) {
    if (a % 2 == 0 && b % 2 == 0)
      return a < b;
    else
      return (a % 2 == 0);
  });

  for (int i : numbers)
    cout << i << endl;

  return 0;
}

Dies sind nur einige wenige Neuerungen, die den Programmierer-Alltag einfacher machen sollen. Das GNU-Projekt hat eine Liste aller Änderungen in C++11 und deren Implementations-Status in GCC: http://gcc.gnu.org/projects/cxx0x.html

Ein Problem von C++11 ist, dass die meisten Compiler noch nicht alle Features des neuen Standards unterstützen und man gerade bei Open Source-Projekten darauf achten muss, dass auch ältere Compiler-Versionen unterstützt werden. Vermutlich wird es daher noch einige Jahre dauern, bis C++11 allgemeintauglich ist.

39.thumbnail Neuerungen in C++11

Autor: Gunnar Beutner

Vor seinem Eintritt bei NETWAYS arbeitete Gunnar bei einem großen deutschen Hostingprovider, wo er bereits viel Erfahrung in der Softwareentwicklung für das Servermanagement sammeln konnte. Bei uns kümmert er sich vor allem um verschiedene Kundenprojekte, aber auch eigene Tools wie inGraph oder in Zukunft um Icinga2.