2017-06-24 8 views
1

Ich beobachtete ein Bjarne Stroustrup sprechen und die Sektion war auf Move-Betreiber und ihre Vorteile."Vererben" Move-Operatoren?

Er erwähnt here, dass eine explizite Bewegung Konstruktor wie:

Matrix(Matrix&& a) 
{ 
    rep = a.rep; 
    a.rep = {}; 
} 

"C-Stil" und "kryptische".

Er fährt fort zu sagen, dass in vielen Fällen das Schreiben von Copy/Move-Operatoren vermieden werden kann; er stellt das folgende Beispiel here:

class Matrix 
{ 
    vector<double> elem; 
    // ... matrix access... 
} 

Er stellt fest, dass dieses Matrix-Klasse „erbt“ Ressourcenmanagement von Vektor und dass das Kopieren/Verschieben Bauer ist implizit es erzeugt.

Kann jemand helfen zu erklären, was er damit meint? Wie würde ich ein Matrix-Objekt nehmen und Bewegungssemantik verwenden, wenn ich keinen Bewegungsoperator für Matrix definiert hätte?

+0

Das Grundkonzept für Move-Konstruktoren ist wie das für Kopierkonstruktoren. Wenn Ihre Membervariablen alle kopierfähig sind, ist kein benutzerdefinierter Kopierkonstruktor für die Klasse erforderlich. Das gleiche gilt für Moves. –

Antwort

3

Verschieben Konstrukteuren, wenn implizit definiert sind

  • X,
  • X keinen Benutzer angegebene Unternehmer Kopie Zuordnung keine benutzer erklärt Copykonstruktor haben, tut
  • X nicht einen von Benutzern deklarierten Zuweisungsoperator haben,
  • X hat keinen vom Benutzer deklarierten Destruktor, und
  • der Verschiebungskonstruktor wäre nicht implizitl y als gelöscht definiert.

So im Fall von Matrix der Umzug Konstruktor wird implizit definiert. Und der implizite Move-Konstruktor tut sein Bestes, um seine Datenelemente zu verschieben. Und std::vector ist beweglich, so bewegt es die Instanz des Vektors in der Struktur Matrix.

0

Da std::vector eine Klasse ist, die diese Funktionalität bereits implementiert hat. Indem Sie das als Ihren Speicher für Matrix verwenden, wenn Sie dabei sind, mit Matrix und seinen Daten herumzuspielen, wird std::vector beteiligt sein und die oben erwähnte Funktionalität in das Spiel bringen.