Considérons ce code :
#include<iostream>
using namespace std;
class Wilma
{
public:
static int i;
Wilma()
{
cout<<"\nWilma ctor\n";
cout<<"\ni::"<<i<<"\n";
}
};
class Fred
{
public:
Fred()
{
cout<<"\nFred ctor\n";
}
static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
int a=0;
Wilma::i=a;//---------- LINE C
Wilma w;
Fred::wilma_=w;//---------- LINE B
}
Ici, la ligne A définit explicitement l'int statique a de la classe Wilma (commenté pour provoquer une erreur de linker). et sans laquelle le linker donne une erreur de référence non définie (parce que Wilma::i est en fait utilisé, si je ne l'utilise pas, il n'y a pas d'erreur de linker).
Il devrait en être de même pour static Wilma wilma_ de la classe Fred, c'est-à-dire qu'il devrait également être explicitement défini, car il est également utilisé dans le code à la ligne B. Mais ce n'est pas le cas, aucune erreur de linker pour Fred::wilma_ si elle n'a pas été explicitement définie. pourquoi ? Testé sur gcc 4.5.2
EDIT : J'ai un autre doute à ce sujet...
LIGNE C y LIGNE B Les deux tentent d'utiliser des objets statiques d'une classe, int Wilma::i
y Wilma Fred::wilma_
respectivement. Mais seule une définition de int Wilma::i
est obligatoire ?
Pourquoi l Wilma Fred::wilma_;
obligatoire ?
Je comprends la réponse que le ligne B est un no-op, mais on peut dire la même chose de ligne C aussi ??