2 votes

Problème avec une valeur indésirable dans un membre lors de l'utilisation d'un constructeur par défaut vide

J'essaie de créer une classe très basique avec un constructeur par défaut :

    class Point {
    public:
          Point() = default;//con 1
          explicit Point(double x): x_axis(x), y_axis(0){}//con 2
          Point(const Point &other) = default;
          ~Point() = default;
    private:
           double x_axis;
           double y_axis;
    }

Lorsque j'essaie d'utiliser le constructeur par défaut de l'application main() génère une valeur aléatoire pour la fonction x_axis :

    Point p1;//generates random value
    Point p2{};//works as intended

Pourquoi ? Lorsque j'utilise l'autre constructeur (con 2) comme ceci :

    explicit Point(double x = 0): x_axis(x), y_axis(0){}

Les deux fonctionnent comme prévu.

  1. pourquoi, au premier essai sans parenthèses, génère-t-il une valeur aléatoire, alors que {} a fonctionné, mais au deuxième essai, les deux fonctionnent ?
  2. ce qui est d'appeler le constructeur par défaut avec {} ?

6voto

Ted Lyngmo Points 3197

C'est parce que le second constructeur initialise les variables membres avec des valeurs alors que le premier constructeur laisse les variables membres avec des valeurs indéterminées.

L'un ou l'autre :

class Point {
public:
    Point() : x_axis{}, y_axis{} {} // instead of  = default
...

ou

class Point {
public:
    Point() = default;

    // ...
private:
    double x_axis{};     // {}     or
    double y_axis = 0.0; // = 0.0  
};

0voto

Anoop Rana Points 1

pourquoi au premier essai, aucune parenthèse n'a généré de valeur aléatoire mais {} a fonctionné, et au deuxième essai, les deux ont fonctionné.

Au premier essai, quand vous avez écrit :

 Point p1; //this uses default constructor

Ici, on utilise le ctor par défaut qui se contente de initialisation par défaut les membres des données y_axis y y_axis . Comme il s'agit de types intégrés, ils ont des valeurs indéterminées.

Au deuxième essai, quand vous avez écrit :

Point p2{}; //this is zero initailization

Ce qui précède est initialisation du zéro ce qui signifie que chaque membre des données est initialisé à 0 .


Maintenant, lorsque vous avez fourni le constructeur suivant :

explicit Point(double x = 0): x_axis(x), y_axis(0) //this is a default constructor
{
}

Ce qui précède est un constructeur par défaut qui initialise les deux membres de la donnée avec 0 en el liste d'initialisation du constructeur .

Ainsi, cette fois-ci, quand vous écrivez :

Point p1; //this uses the above provided default ctor

Cette fois. p1 est construit par défaut en utilisant le ctor par défaut qui initialise les deux membres des données à 0 et donc à la fois x_axis y y_axis de p1 sera initialisé à 0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X