10
votes

Pourquoi le constructeur est utilisé au lieu de fonctions?

C'est une question très fondamentale, je l'ai recherchée, mais je veux juste demander à cette communauté que nous avons tous les deux constructeurs et méthodes . Mais normalement, nous utilisons le constructeur pour initialiser les variables au lieu des méthodes. Je pense que les deux peuvent être utilisés pour initialiser les variables. Alors, quelle est la différence de base entre les deux. Y a-t-il une raison solide? C'est une question très fondamentale, alors gardez-la pour des raisons de débutant. Merci d'avance ..


0 commentaires

7 Réponses :


8
votes

La différence la plus importante: Lorsque vous instaniez un objet, le constructeur sera invoqué alors que l'appel d'une méthode est toujours facultatif. Vous pouvez donc oublier d'appeler votre méthode d'initialisation et ne pas tout initialiser correctement.

Par exemple, toutes ces méthodes normales d'instanciation d'un objet appelleront le constructeur xxx

ou Si vous avez des arguments obligatoires, ne définissez pas un constructeur par défaut et nécessite plutôt une construction avec des paramètres: xxx

Cela présente l'avantage de nécessiter les arguments avant même d'instancier la classe. Donc, vous êtes obligé de faire: xxx

et omet de construire avec des arguments valides devient une erreur de compilateur: xxx

Donc, dans la mesure du possible, errez toujours sur le côté de votre initialisation dans un constructeur. Il y a quelques cas où un constructeur pourrait ne pas être viable. Par exemple, le seul moyen d'échouer d'un constructeur consiste à utiliser une exception. L'échec à construire peut être «routinier» et non vraiment exceptionnel. Les exceptions peuvent également être coûteuses sur certaines architectures. Un autre cas pourrait être lorsque vous souhaitez vous assurer que les méthodes virtuelles sont entièrement liées, ce qui est garanti pour être vrai uniquement après la construction.


2 commentaires

En fait, je demande à l'initialisation avec certaines valeurs demandées par l'utilisateur, supposons que, à des fins de simulation, nous devons initialiser environ 20 variables aux valeurs données. Si j'initialise chaque variable correctement, alors dans ce cas, allez-vous coller à votre argument?


@kashmirileLégion voir mes modifications. Si vous devez initialiser 20 variables, vous pouvez définir un constructeur qui prend 20 variables ou une structure.



3
votes

Ils ne peuvent pas tous deux être utilisés pour initialiser les variables des membres. C'est le travail du constructeur d'initialiser les membres, et il est appelé automatiquement chaque fois que vous créez une nouvelle instance.

Considérez les éléments suivants: xxx

sans le constructeur, ne serait aucun moyen d'initialiser le membre x .


2 commentaires

Ce qui est bien et bon jusqu'à ce que vous ayez besoin de retourner un code d'erreur au moment de l'exécution. : P


+1 pour votre bonne réponse. MERCI VOTRE ARGUMENT DONNÉ DE LA FORCE DE L'INTÉGOIRE DE FAIRE DE FAÇON CLAIR DES CONSTRUCTEURS.



0
votes

Le constructeur est invoqué automatiquement lorsque vous créez l'objet contrairement à une fonction. En outre, le constructeur est utilisé pour indiquer l'intention de cela pour l'initialisation de l'objet.


0 commentaires

0
votes

Imaginez que vous avez une variable de membre qui n'a pas de constructeur vide. Ensuite, vous n'avez aucune autre option mais pour l'initialiser dans la liste d'initialistes de votre constructeur.

Le constructeur est également appelé lorsque vous allouez un tableau avec le nouvel opérateur, tandis que l'initialisation avec des méthodes rendra le code de manière plus compliquée.

En général, la logique complexe dans le constructeur n'est pas très bonne idée, mais une simple initialisation doit être effectuée là-bas (les choses que vous devez faire pour vous assurer que votre objet est dans un état valide).


0 commentaires

1
votes

Les constructeurs sont appelés automatiquement, il n'est donc pas nécessaire de s'inquiéter de savoir si l'utilisateur a invoqué une méthode d'initialisation encore. Cependant, le Guide de style Google a quelque chose à dire sur les constructeurs :

  • Il n'y a pas de moyen facile pour les constructeurs de signaler des erreurs, à l'aide d'exceptions.
  • Si le travail échoue, nous avons maintenant un objet dont le code d'initialisation a échoué, il peut donc s'agir d'un état indéterminé.
  • Si le travail appelle des fonctions virtuelles, ces appels ne seront pas expédiés aux implémentations de la sous-classe. La modification future de votre classe peut poser tranquillement ce problème même si votre classe n'est pas actuellement sous-classée, causant beaucoup de confusion.
  • Si quelqu'un crée une variable globale de ce type, le code du constructeur sera appelé avant principal (), éventuellement casser certaines hypothèses implicites dans le code du constructeur.

    La recommandation de Google est d'avoir une initiation simple dans un constructeur et une initiation non triviale dans une méthode distincte.


2 commentaires

Ce qui est bien et bon, à moins que vous soyez un fan d'objets immuables.


L'argument principal pour suivre le guide de style C ++ de Google semble être le grand nom. Je n'aime pas totalement leur vue sur (non) en utilisant des exceptions. Si vous n'utilisez pas d'exceptions, vous utilisez un style très similaire de C ++. Un expert C ++ bien connu une fois dit: www2.research.att.com/~bs/ 3RD_Safe0.html Pour répondre à votre liste à bulleted: (1) Ensuite, utilisez simplement des exceptions (vous venez de découvrir qu'il est essentiel d'utiliser des constructeurs / Raii) (2) à nouveau, vous n'aurez pas un objet invalide si vous lancez. Une exception (3) Je suis d'accord, certains problèmes méchants peuvent survenir, le compilateur devrait vous avertir. (4) Donc, aucun code dans les constructeurs?



0
votes

Initialisation des variables n'est pas un doute, une pratique de programmation très importante. Lorsque vous utilisez des classes, l'option consiste à les initialiser à l'intérieur des méthodes. Ainsi, nous avons deux étapes: -

  1. Définissez la méthode
  2. appelez la méthode pour effectuer l'initialisation

    Mais si "l'appel de la méthode" est oublié, les variables finissent par avoir des valeurs indésirables. Pour rendre la vie plus facile pour le programmeur, le concept d'une méthode de constructeur a été introduit.

    avec constructeurs, nous avons juste une étape: -

    1. Définissez le constructeur

      La «partie appelante» est effectuée automatiquement chaque fois qu'un nouvel objet de la classe est créé.


0 commentaires

0
votes

Les constructeurs peuvent être utilisés pour une gestion efficace de la mémoire, ce qui n'est pas possible avec des fonctions.

Destructor peut être utilisé pour détruire les constructeurs lorsqu'il n'est pas nécessaire.

De plus, l'utilisation de Copy Constructor est connue pour empêcher les difficultés ou les erreurs dues à des erreurs de la mémoire.


0 commentaires