Neben den Leistungsproblemen gibt es noch eine weitere sehr wichtige, die ich Code-Wartbarkeit und Erweiterbarkeit nennen würde.
Wenn ein T ein POD ist und Sie eine Initialisierungsliste bevorzugen, dann müssen Sie nicht mehr um die Initialisierung herum Änderungen vornehmen, um unnötige Konstruktoraufrufe zu vermeiden, da diese bereits optimiert sind .
Wenn Typ T über einen Standardkonstruktor und einen oder mehrere benutzerdefinierte Konstruktoren verfügt und Sie einmal das Standard-Konstruktor entfernen oder ausblenden, müssen Sie bei Verwendung der Initialisierungsliste den Code für Ihren Benutzer nicht aktualisieren -definierte Konstruktoren, weil sie bereits korrekt implementiert sind.
Gleiche mit const Mitglieder oder Referenzelemente, sagen wir mal zunächst T wie folgt definiert ist:
struct T
{
T() { a = 5; }
private:
int a;
};
Als nächstes Sie sich entscheiden, eine als const zu qualifizieren, wenn Sie Initialisierungsliste von Anfang an verwenden würde, dann ist diese eine einzige Zeile ändern, aber wie oben die T definiert zu haben, es erfordert auch die Konstruktordefinition zu graben 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, wenn Code wesentlich einfacher und weniger fehleranfällig ist war geschrieben nicht von einem "Code Monke" y "aber von einem Ingenieur, der Entscheidungen aufgrund einer tieferen Überlegung über das macht, was er tut.
Klassenmitglieder verwenden, die Klassen sind, können POD sein, auch –
ein Muss ist auch wichtig bei einer Referenz – 4pie0
Warum nicht „a (3);“ oder "a = A (3);" im Körper des Standardkonstruktors von B? – Sergey