En appelant le Constructeur de la Classe en Fonction de Membre

Voici un programme, où j'essaie d'appeler le constructeur de la classe de multi::multi(int, int), dans la fonction void multi::multiply(). La sortie est

30

30

au lieu d'attendre

30

25

Pourquoi?

#include <iostream.h>

class multi{
    private:
        int a;
        int b;
    public:
        multi(int m, int n){
            a = m;
            b = n;
        }

        void multiply(){
            cout << "\n\n" << a*b;
            multi (5, 5);
            cout << "\n" << a*b;
        }
};

main(){
    multi x(5,6);

    x.multiply();
return 0;
}
Le point d'un constructeur est construction votre objet. Sauf si vous utilisez la magie noire, qu'un seul constructeur est appelé, une seule fois, pour tout objet donné. Une fois que vous avez besoin de faire un traitement supplémentaire, qui n'est pas le travail d'un constructeur plus. Il suffit de ne a = 5; b = 5; au lieu de votre multiply méthode.
Mieux utiliser l'initialisation des listes dans les constructeurs c'est à dire multi(int m, int n) : a(m), b(n) {}
Alternative qui fonctionne: *this = multi (5, 5);
cela peut fonctionner dans certains cas, mais en général, complètement écraser l'objet à l'intérieur de sa propre fonction membre est une très mauvaise idée.
L'opérateur d'affectation est un peu inhabituel syntaxe, mais n'affecte en aucune manière la sécurité. Si vous appelez *this = X, this->operator=(X) ou this->Foo(X), la seule chose qui affecte la sécurité est ce que le code fait réellement.

OriginalL'auteur DragonClaw | 2013-01-18