Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Moderators
Δημοσ.

Καλησπέρα σας και καλό μήνα. Προσπαθώ να λύσω κάτι παλιά θέματα της σχολής μου σε C++, και κατάφερα να κολλήσω από το πρώτο θέμα. Η εκφώνηση δίνει τον παρακάτω κώδικα και ζητάει την έξοδο του προγράμματος και αιτιολόγηση.

class Mom
{
public:
    Mom() { cout << "Mom is here!" << endl; }
    Mom(const Mom&) { cout << "Like another Mom" << endl; }
    virtual ~Mom() { cout << "Mom is leaving..." << endl; }
    virtual void foo() { cout << "Mom cooking()" << endl; }
    virtual Mom& operator=(const Mom& rhs) {
        cout << "Mom op=" << endl;
        return *this;
    }
};

class Child : public Mom
{
public:
    Child() { cout << "Child is here!" << endl; }
    virtual ~Child() { cout << "Child is leaving" << endl; }
    virtual void foo() { cout << "Child playing" << endl; }
protected:
    Mom mInstanceOfMom;
};

Mom foo(Mom& input)
{
    input.foo();
    return input;
}

int main()
{
    Child myChild;
    Child myOtherChild;
    Mom myMom;
    myOtherChild = myChild;
    myMom = foo(myOtherChild);

    return 0;
}

Στο myOtherChild = myChild μου εκτυπώνει 2 φορές το Mom op=. Δεν καταλάβαινα γιατί το κάνει αυτό και μετά από ψάξιμο βρήκα το copy elision και το RVO. Τρέχω το πρόγραμμα σε Visual Studio 2013 με το /Od flag (Optimization disabled).

 

Κατ' αρχάς δεν καταλαβαίνω γιατί να έκανε ένα τέτοιο optimization από τη στιγμή που τα έχω απενεργοποιήσει. Αυτό που σκέφτηκα είναι ότι δεν είναι RVO και γίνεται για κάποιον άλλον λόγο, οπότε έκανα step into στο disassembly. Το Mom operator= καλείται μία φορά, επιστρέφει και στη συνέχεια υπάρχει ένα call edx, το οποίο δείχνει πάλι στο Mom operator=. Το κομμάτι που έχει το call edx δεν υπάρχει σε κάποιο source file (ή τουλάχιστον έτσι μου λέει το VS).

 

Αυτό που θα έγραφα εγώ στο θέμα θα ήταν ότι καλείται ο operator= της Mom, εφόσον δεν υλοποιείται ο operator= του Child, άρα εκτυπώνεται το Mom op=. Θα μπορούσε κάποιος να ξεκαθαρίσει λίγο τα πράγματα;

 

Ευχαριστώ

  • Moderators
Δημοσ.

Την τελευταία γραμμή την έχω βάλει σε comments. Ο operator= καλείται 2 φορές στο myOtherChild = myChild.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...