mai
2010
Après avoir abordé la référence r-Value dans mon dernier billet, passons au mot-clef auto.
auto permet de déclarer une variable sans spécifier son type de donnée.
Un exemple très simple :
auto myvar= 1 ;
La ligne ci-dessus déclare un variable sans préciser son type.
Celui-ci est déterminé par le compilateur en examinant la partie droite de l’expression.
Le code est alors transformé en :
int myvar= 1 ;
Donc s’il n’y a pas d’affectation le compilateur ne peut pas déterminer le type et retournera donc une erreur.
Le point important qu’il faut retenir c’est que le type de donnée est déterminé à la compilation et non à l’exécution du code.
Dans mon article sur Visual studio 2010 j’avais évoqué les améliorations d’IntelliSense, dans le contexte présent celui-ci nous fournit directement le type de donnée qui sera associée à la variable, il suffit de survoler la souris sur le nom de la variable.
On pourra donc déclarer toutes sortes de variable : des pointeurs, des tableaux de pointeur des constantes, tout cela est possible à partir du moment ou le compilateur peut déterminer le type associé dans la déclaration.
auto pMyVar=&myvar ; // un pointeur sur myvar.
const auto nMax=100 ; // une constante.
Etc ..
Ce qui ne peut est géré :
L’utilisation d’auto pour le retour d’une fonction :
auto getval();
L’utilisation d’auto pour l’argument d’une fonction
int getval(auto n) ;
La déclaration d’une variable avec auto dans la déclaration d’une classe ou d’une structure.
Les déclarations multiples sur une ligne qui donnent lieu à des types différents :
auto n=1,d=1.0 ,l=1L ;
Après ce tour d’horizon des fonctionnalités basiques de ce mot clef, examinons maintenant ce pour quoi il va être vraiment utile.
Vous avez certainement tous utilisé les conteneurs de la STL (j’espère !) , en voici un exemple tiré de mes codes :
std::vector<CItem> m_Items;
// dans mon code:
std::vector<CItem>::iterator it;
for(it=m_Items.begin();it!=m_Items.end();++it)
if(it->m_nID==nID)
return (it->m_dwFlags & itemChecked)!=0;
auto va me permettre de me libérer de la syntaxe lourde de l’itérateur (qui est ici très simple):
if(it->m_nID==nID)
return (it->m_dwFlags & itemChecked)!=0;
C’est plus agréable à écrire non ?
Si j’ai besoin d’un const_iterator , la classe vector y pourvoit :
if(it->m_nID==nID)
return (it->m_dwFlags & itemChecked)!=0;
le couple begin() end() laisse la place à cbegin() cend().
Mon exemple était volontairement simple, mais je pense que tout le monde appréciera la simplicité retrouvée pour déclarer un itérateur sur un objet conteneur.
Référence MSDN
Articles récents
Commentaires récents
Archives
- septembre 2010
- mai 2010
- avril 2010
- février 2010
- août 2009
- juin 2009
- mai 2009
- février 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006