La première utilise ce qu'on appelle un initialization list. Lorsque vous entrez le corps du constructeur, tous les membres de classes doivent avoir été construits (pour pouvoir être utilisés). Donc, si vous avez ceci:
class Foo
{
public:
Foo()
: str() // this is implicit
{
str = "String.";
}
private:
std::string str;
};
Ainsi, str
obtient construit, puis affecté. Mieux aurait été:
class Foo
{
public:
Foo()
: str("String.")
{
}
private:
std::string str;
};
Alors que str
est directement construit. Cela ne fait pas de différence dans votre cas car les pointeurs n'ont pas de constructeur.
Il est généralement considéré comme une bonne pratique d'utiliser une liste d'initialisation par rapport au code courant dans le constructeur. La liste d'initialisation doit être utilisée pour l'initialisation, le constructeur doit être utilisé pour exécuter le code.
De même, pourquoi utiliser un pointeur sur une chaîne? Si vous voulez une chaîne, utilisez une chaîne; pas un pointeur sur une chaîne. Les chances sont, vous voulez réellement une chaîne.
En savoir plus sur les listes de initialiseur:
listes Initializer ont plus d'utilisations que de membres de la initialisation classe.Ils peuvent être utilisés pour passer des arguments dans les constructeurs de base:
class Foo
{
public:
Foo(int i) { /* ... */ }
}
class Bar
: public Foo
{
public:
Bar()
: Foo(2) // pass 2 into Foo's constructor.
// There is no other way of doing this.
{
/* ... */
}
};
Ou membres constants:
class Foo
{
public:
Foo()
: pi(3.1415f)
{
pi = 3.1415f; // will not work, pi is const.
}
private:
const float pi;
};
Ou références:
class Foo
{
public:
Foo(int& i)
: intRef(i) // intRef refers to the i passed into this constructor
{
intRef = i; // does *not* set intRef to refer to i!
// rather, it sets i as the value of
// the int intRef refers to.
}
private:
int &intRef;
};
Ce n'est pas exactement la même chose car si vous faites ce dernier, vous ne pouvez pas créer une image const. Probablement pas quelque chose que vous voulez faire dans ce cas, mais potentiellement intéressant pour les types plus légers. –
Si vous avez une image const, vous voudrez probablement aussi un const m_sFileName, donc je ne vois pas le problème. – MSalters