2016-07-02 6 views
1

ich Code wieGibt es Vorteile in C const Membervariable mit ++

template <typename XAxis, typename YAxis> 
class Interpolation { 
public: 
    using x_value_type = typename XAxis::value_type; 
    using y_value_type = typename YAxis::value_type; 

    Interpolation(const XAxis& x_axis, const YAxis& y_axis) 
     : _x_axis(x_axis), _y_axis(_y_axis) 
    {} 

public: 
    y_value_type interpolate(const x_value_type& x) const; 

private: 
    const XAxis _x_axis; 
    const XAxis _y_axis; 
}; 

schreiben, wenn ich nicht auf Vorsatz möchten, dass Membervariablen unveränderlich ist.

Ich fühle mich ein wenig ängstlich, warum ich denke, dass ich über den Code bekannt sein könnte ist illegal oder schlechter Code aus irgendeinem Grund.
Wie denken Sie, dass konstante Elementvariablen vorteilhaft sind oder nicht?
Bitte teilen Sie mir Ihren Grund mit.

+1

Mit 'const' Mitgliedern können Sie keine Zuweisungsoperatoren definieren. Auf der anderen Seite, mit 'std :: shared_ptr ' Mitglieder möglicherweise angemessen sein. –

Antwort

0

Ein praktischer Vorteil von const Mitgliedern ist, dass sie explizit initialisiert werden müssen, es sei denn, sie gehören zu einer Klasse mit benutzerdefiniertem Standardkonstruktor. Ein ¹standardkonformer Compiler fängt also jede fehlende Initialisierung ab. Es ist auch ein Vorteil, dass const Mitglieder die beabsichtigte Funktionalität ausdrücken, nämlich keine Änderung über die Lebensdauer eines Objekts, und so dem Compiler helfen, Code zu erkennen, der die Werte (fälschlicherweise) ändern würde.

Auf der anderen Seite, die wichtiger sein können, mit der Standardfunktionalität verhindern sie kopieren Zuweisung und verschieben.

Diese Überlegungen gelten auch für Referenzdatenelemente, die (konzeptuell) als auto-dereferenzierte Zeigerelemente betrachtet werden können.


Für Client-Code, aber nicht die eigene Code Klasse, der logisch const -ness, die Unveränderlichkeit, kann durch die Verwendung nicht public nicht const Datenelemente mit const Accessor Mitgliederfunktionen ausgedrückt werden.


¹ Leider Visual C++ 2015 zumindest einige Fälle von nicht initialisierten const Mitglied akzeptiert, die keine benutzerdefinierten Standardkonstruktor haben, so wie dieses Schreiben ist ein nicht zu 100% sicher sein, dass die Der Compiler fängt fehlende Initialisierungen ab.

0

Für mich scheint es unnötig, wie Sie immer const Mitgliedsfunktionen haben, um sicherzustellen, dass Sie die Felder nicht ändern. Außerdem haben const Membervariablen auch die Bewegungssemantik deaktiviert, was bedeutet, dass ein Objekt dieses Typs immer kopiert werden muss und nicht verschoben werden kann. Ich würde es unterlassen.

+1

Ist das wirklich wahr? Würde der Standardbewegungskonstruktor nicht einfach die anderen Elemente verschieben und die Konstanten kopieren? Was für Primitive ohnehin irrelevant ist. –

+1

@NirFriedman Sie haben Recht. 'const' Member Variablen werden kopiert, während nicht' const' Elemente verschoben werden. – Blazo

0

const Elementvariablen haben einen kleinen Vorteil. Da der Compiler weiß, dass ihr const und ihr Wert nicht ändern können, kann der Compiler Code und Ausdrücke, die auf die const-Klassenmember verweisen, möglicherweise besser optimieren.

Ein praktischerer Vorteil ist, dass alle logischen Codefehler, die versuchen, diese Klassenmitglieder zu ändern, jetzt nicht kompilieren können. Andernfalls ist der logische Fehler möglicherweise nicht sofort offensichtlich und führt dazu, dass später viel Zeit verbraucht wird, um ihn aufzuspüren.

0

Konst Mitglieder:

  1. verhindern kopieren und verschieben Zuordnung

  2. bekannt sind nie

  3. machen Ihr Objekt wirklich unveränderlich zu ändern, was die folgenden Vorteile:

-

  1. bietet Vorteile Leistung, wenn Daten in einem Multithread-Programm zu teilen.

  2. ermöglicht es dem Compiler sehr aggressiv mit redundanten Last Optimierungen wandelbar Daten

Sie konnten erreichen das gleiche mit konst Accessoren zu sein.

Das stimmt, auf Kosten von mehr (redundanten) Code zu pflegen.