Neben den Leistungsproblemen gibt es noch einen sehr wichtigen, den ich als Wartbarkeit und Erweiterbarkeit des Codes bezeichnen würde.
Wenn ein T POD ist und Sie anfangen, die Initialisierungsliste zu bevorzugen, müssen Sie, wenn T einmal in einen Nicht-POD-Typ wechselt, nichts an der Initialisierung ändern, um unnötige Konstruktoraufrufe zu vermeiden, da diese bereits optimiert ist.
Wenn Typ T über einen Standardkonstruktor und einen oder mehrere benutzerdefinierte Konstruktoren verfügt und Sie sich einmal dazu entschließen, den Standardkonstruktor zu entfernen oder auszublenden, müssen Sie bei Verwendung der Initialisierungsliste den Code nicht aktualisieren, wenn Ihre benutzerdefinierten Konstruktoren vorhanden sind Sie sind bereits korrekt implementiert.
Nehmen wir an, T ist zunächst wie folgt definiert:
struct T
{
T() { a = 5; }
private:
int a;
};
Als nächstes entscheiden Sie sich, eine als const zu qualifizieren. Wenn Sie die Initialisierungsliste von Anfang an verwenden würden, wäre dies eine Änderung in einer einzelnen Zeile. Wenn Sie jedoch das T wie oben definiert haben, müssen Sie auch die Konstruktordefinition ausgraben, um die Zuordnung zu entfernen:
struct T
{
T() : a(5) {} // 2. that requires changes here too
private:
const int a; // 1. one line change
};
Es ist kein Geheimnis, dass die Wartung viel einfacher und weniger fehleranfällig ist, wenn Code nicht von einem "Code-Affen" geschrieben wurde, sondern von einem Ingenieur, der Entscheidungen trifft, die auf tieferen Überlegungen darüber beruhen, was er tut.