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
Mieux utiliser l'initialisation des listes dans les constructeurs c'est à dire
Alternative qui fonctionne:
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
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
Vous devez vous connecter pour publier un commentaire.
Il crée un objet temporaire, et est détruit à la fin de l'expression complète. Il ne fait pas de reproduction ou d'impression.
Pour voir le résultat souhaité, vous pouvez ajouter un
reset()
fonction de membre à votre classe:Par la voie, préférez l'utilisation de membre-l'initialisation de la liste lors de la définition des constructeurs.
OriginalL'auteur Nawaz
Lorsque vous appelez le constructeur
multi(5, 5)
vous êtes en fait la création d'un objet temporaire est immédiatement détruits.OriginalL'auteur Steve
Cela ne fonctionne pas, parce que
multi(5, 5);
crée un objet temporaire de la classemulti
, qui est immédiatement détruit, parce qu'il n'est pas utilisé pour quoi que ce soitDepuis
multiply()
est une fonction membre de la classemulti
, il a accès aux membres privés, de sorte qu'il suffit de définira
etb
directement. Vous pouvez obtenir votre résultat attendu par la réécrituremultiply
comme ceci:OriginalL'auteur Dima
Vous ne pouvez pas appeler les constructeurs de ce genre. Ce que votre code n'est de créer une nouvelle instance temporaire de
multi
, qui est rejeté immédiatement.Une fois qu'un objet est construit, vous ne pouvez pas appeler son constructeur. Créer un
assign()
fonction ou quelque chose de similaire dans votre classe.OriginalL'auteur Angew
Vous ne pouvez pas appeler un constructeur d'un objet déjà créé. Ce que vous faites dans le code est, la création d'un objet temporaire.
Compilateur affiche le message d'erreur si vous essayez de faire
this->multi(5,5).
OriginalL'auteur Nitin Anand