Lors de la construction d’un objet d’une classe, il est possible d’initialiser directement ses membres à l’aide d’une liste d’initialisation. Cette approche est plus efficace que l’affectation dans le corps du constructeur, surtout pour les objets complexes.
#include <iostream>
class Point {
public:
Point(int x_val, int y_val);
private:
int x;
int y;
};
Point::Point(int x_val, int y_val) : x(x_val), y(y_val) {
std::cout << "x = " << x << '\n';
std::cout << "y = " << y << '\n';
}
int main() {
Point p(6, 9);
return 0;
}
Dans cet exemple, les membres x et y sont initialisés directement à partir des paramètres passés au constructeur, sans passer par une affectation ultérieure.
Constructeurs de classses composées
Lorsqu’une classe contient des objets d’autres classes comme membres (composition), ces sous-objets doivent être initialisés via la liste d’initialisation :
class Engine {
public:
Engine(int power) { /* ... */ }
};
class Car {
public:
Car(int engine_power) : engine_(engine_power) {}
private:
Engine engine_;
};
La syntaxe générale est :
Classe::Classe(params) : membre1(args1), membre2(args2), ... {
// Corps du constructeur
}
Héritage et transmission de paramètres au constructeur de la classe de base
Lorsqu’une classe dérivée hérite d’une classe de base dont le constructeur requiert des arguments, la classe dérivée doit impérativement transmettre ces arguments via sa propre liste d’initialisation :
#include <iostream>
class Base {
protected:
int value;
public:
Base(int v) : value(v) {
std::cout << "Base initialized with: " << v << '\n';
}
};
class Derived : public Base {
protected:
int extra;
public:
Derived(int v) : Base(v), extra(v) {
std::cout << "Derived initialized with: " << v << '\n';
}
};
int main() {
Derived d(42);
return 0;
}
Si la classe de base ne possède pas de constructeur sans paramètre, omettre cette initialisation explicite provoque une erreur de compilation. Le compilateur ne peut pas deviner comment construire la partie héritée de l’objet.
Les paramètres transmis au constructeur de la classe de base servent généralement à initialiser ses membres protégés ou privés, ou à conifgurer un état nécessaire dès la construction (par exemple, dimensions d’une fenêtre, type d’un périphérique, etc.).