Builder Initializer Liste de C avec des exemples


Dans cet endroit, je vais vous expliquer ce qui est la liste d'initialisation du constructeur? listes d'initialisation sont utiles pour initialiser le membre de données de la classe. En fait, le fabricant fait ce genre de choses à l'intérieur de votre corps droit?

2. Une classe avec un const membre de données

Disons une classe est d'avoir un membre de données const en elle. Où devrions-nous l'initialiser? Nous explorons avec un exemple.




La classe est écrite pour calculer la surface du cercle pour un rayon donné. La classe a un const membre de données, qui contient la valeur de Pi. Le constructeur de classe initialise le membre de données de rayon, le plus constant et calcule la surface et magasins. Le fabricant est la suivante:

// Exemple 03: Cela jette erreur CCircle (rad float) { pi = 3,14159; m_radius = rad; m_Area = pi * * m_radius de m_radius; }

Lorsque vous compilez le code, vous obtenez l'erreur spécifiée ci-dessous. Parce que, plus membre est déclaré const float pi;

3. Erreur C2758 et Constructor Liste Initializer

L'erreur a clairement indiqué que les membres const doit être initialisé avec la liste du fabricant initialisation. L'image ci-contre montre la création de la liste d'initialisation:

Comme vous pouvez voir la liste des initialisation est effectuée avant l'exécution de la première instruction qui se produit dans le corps du constructeur. OK, revenir à notre exemple, nous devons modifier notre constructeur, afin que le plus initialise const dans la liste d'initialisation. Le fabricant est modifié comme suit:

// Exemple 04: Builder avec Initializer CCircle (rad float): pi (3,14159), m_Area (pi * * m_radius m_radius) m_radius (rad) {}

Notez que la liste est d'avoir trois initialisation séparées par des virgules. Grâce à la liste d'initialisation nous avons initialisé pi, m_radius et également calculé ainsi m_area. Mais, certaines personnes préfèrent valeurs calculées sont dans le corps du constructeur, car il va utiliser le membre déjà initialisé. Montre l'ensemble exemple ci-dessous:

// Exemple 01 #include "stdafx.h" #include using namespace std; Classe CCircle { // exemples: 01 membres de la classe Triangle Privé: pi float const; m_radius flotter; m_Area flotter; publique: // Exemple 02: Méthode retruning calculé une zone flotter getArea () { m_Area revenir; } //// Exemple 03: Cela jette erreur // CCircle (rad float) // { // Pi = 3,14159; // M_radius = rad; // M_Area = pi * * m_radius de m_radius; // //} // Exemple 04: Builder avec Initializer CCircle (rad float): pi (3,14159), m_Area (pi * * m_radius m_radius) m_radius (rad) {} }; int main () { // Exemple 05: Créer le Cercle de l'objet // Avec membre const avec elle. CCircle objCircle (3); cout << endl; cout << "Espace de Cercle:" << objCircle.GetArea (); }

Le résultat de l'exécution du programme est le suivant:

4. Plusieurs données Const par sujet

Dans l'exemple ci-dessus nous associons la valeur const 3,14159 pour la const pi membre de données. Dans certains cas, chaque objet a besoin de sa propre valeur const. Disons, par exemple, se développe un programme de traitement de la paie, qui utilise une classe qui représente un groupe d'employés sous la forme de service. Nous permet de dire bonus pour chaque département varie, mais le même bonus est appliqué à tous les employés dans un service. Dans ce cas, la prime est constante et const est associée à une valeur lorsque l'objet est créé. Regardez l'exemple illustré ci-dessous:

// Exemple 02 #include "stdafx.h" #include using namespace std; Classe CEmployees { // Exemple 01: les membres privés. Privé: m_Emp1Salary flotter; m_Emp2Salary flotter; m_Emp3Salary flotter; m_bunus_percent float const; publique: // Exemple 02: Constrctor Liste Initializer CEmployees (float e1_sal, float e2_sal, float e3_sal, flotter PercentBonus): m_Emp1Salary (e1_sal) m_Emp2Salary (e2_sal), m_Emp3Salary (e3_sal) m_bunus_percent (PercentBonus) {} // Exemple 02: Changement Employé Salaire annuler Change_Salary (EMP_NO int, float NEW_SALARY) { if (EMP_NO == 1) m_Emp1Salary = NEW_SALARY; if (EMP_NO == 2) m_Emp2Salary = NEW_SALARY; if (EMP_NO == 3) m_Emp3Salary = NEW_SALARY; } // Exemple 03: Bonus Calculer et Imprimer Print_SalaryandBonus vide () { cout << endl; cout << "Employé 1:" << endl; cout << "Salaire =" << << "Bonus =" m_Emp1Salary << M_Emp1Salary * m_bunus_percent/100 << endl; cout << "Employé 2:" << endl; cout << "Salaire =" << << "Bonus =" m_Emp2Salary << M_Emp2Salary * m_bunus_percent/100 << endl; cout << "employé 3:" << endl; cout << "Salaire =" << << "Bonus =" m_Emp3Salary << M_Emp3Salary * m_bunus_percent/100 << endl; cout << "==========================" << endl; cout << endl; } }; int main () { // Exemple 04: Les employés de comportement de soudage CEmployees Welding_Emps (2000, 3000, 2500, 10); Welding_Emps.Print_SalaryandBonus (); // Exemple 05: Tour Dept employés CEmployees Lathe_Emps (1000.3700, 2000, 5); Lathe_Emps.Change_Salary (1, 6000); Lathe_Emps.Print_SalaryandBonus (); }

Dans l'exemple, vous pouvez voir que le bonus est déclarée comme constante const float m_bunus_percent ;. Mais, le const, est étroitement liée à une valeur fournie par l'utilisateur dans le PercentBonus. La liste d'initialisation du constructeur est la suivante:

// Exemple 02: Constrctor Liste Initializer CEmployees (float e1_sal, float e2_sal, float e3_sal, flotter PercentBonus): m_Emp1Salary (e1_sal) m_Emp2Salary (e2_sal), m_Emp3Salary (e3_sal) m_bunus_percent (PercentBonus) {}

Regardez les deux énoncés ci-dessous. Nous avons deux CEmployees Objets Welding_Emps et Lathe_Emps. Mais, ces objets lors de la création de la ligue en pourcentage des primes différentes 10:05, respectivement. La chose importante, ce est que un des objets constants ne peuvent pas être modifiés après le lien est fait. Dans notre cas, Welding_Emps possèdent pourcentage de bonus de 10 et Tour travailleurs ont le pourcentage de bonus de 5. Cet exemple utilise également la liste des initialisation du fabricant et est requise, car nous avons un membre constante pour maintenir le pourcentage de bonus.

CEmployees Welding_Emps (2000, 3000, 2500, 10);
CEmployees Lathe_Emps (1000.3700, 2000, 5);


Exemple de sortie:




Sortie, vous pouvez voir que le salaire pour un travailleur est modifié. Mais de bonus pour cent ne peut être modifié de 5 pour cent à 10 pour Lathe_Emps et Welding_Emps ..

5. commandes de liste d 'initialiseurs

L'ordre de la liste des constructeur initialisation ne est pas aussi important que la procédure d'initialisation concernant l'ordre dans lequel l'objet est placé dans la classe du modèle. Mais, ce est une bonne pratique de garder la liste d'initialisation pour correspondre à l'élément de données de mise en page de la classe. Dans l'exemple suivant, je ne ai pas gardé un ordre quelconque dans la liste d'initialisation du fabricant qui correspondent à la présentation du modèle de classe CGameCar variable membre. La liste d'initialisation du constructeur est la suivante:

// Exemple 04: GameCar classe Classe CGameCar { Privé: M_engine CEngine; M_tyres CTyres; M_glass CGlass; publique: CGameCar (): m_glass (3), m_tyres (2), m_engine (3) {} };

En regardant l'exemple ci-dessus on pourrait penser que l'ordre d'initialisation est m_glass, m_tyres et enfin m_engine. Mais l'ordre d'initialisation est le moteur, les pneus et le verre. Ce est parce que les objets ont été couchés dans le modèle de classe comme celui indiqué ci-dessous:

Privé: M_engine CEngine; M_tyres CTyres; M_glass CGlass;

Ce qui suit est l'échantillon complet et la sortie ci-dessous:

// Exemple 03 #include "stdafx.h" #include using namespace std; // Exemple 01: La classe du moteur Classe CEngine { Privé: int m_x; publique: CEngine (int x) { m_x = x; cout << "moteur Créé" << endl; } }; // Exemple 02: pneumatiques de classe Classe CTyres { Privé: int m_x; publique: CTyres (int x) { m_x = x; cout << "Pneus Créé" << endl; } }; // Exemple 03: Classe verre Classe CGlass { Privé: int m_x; publique: CGlass (int x) { m_x = x; cout << "avant et arrière Lunettes créés" << endl; } }; // Exemple 04: GameCar classe Classe CGameCar { Privé: M_engine CEngine; M_tyres CTyres; M_glass CGlass; publique: CGameCar (): m_glass (3), m_tyres (2), m_engine (3) {} }; // Exemple 05: La principale méthode d'essayer de créer l'GameCar de classe int main () { cout << endl; Car1 CGameCar; return 0; }

Sortie:

Encore une fois, l'ordre est basé sur la disposition de la classe de modèle et l'ordre dans lequel vous façonner la liste d'initialisation. Il conviendra de maintenir l'ordre dans la liste de la classe de mise en page et l'initialisation ainsi. Cela vous aidera à connaître l'ordre d'initialisation sans regarder l'agencement de la classe.

Résumé

Avez-vous vu une initialisation liste de constructeur est utile d'attribuer une valeur à la const membre de données. Puis, avec un exemple, nous pouvons voir que nous avons plusieurs objets du même type de classe ayant une valeur constante différente. Enfin, ce centre vous a montré l'ordre de la liste d'initialisation ne est la mise en page de la volonté de la classe.

Il convient de noter que l'initialisation liste de constructeur est utile pour associer les données de référence de membre ainsi.

voter il:

(0)
(0)
Article précédent Tout ce qui est un Degu

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha