2009-09-07 11 views
2

Je présente mes excuses à l'avance, mon C++ est rouillé ...C++ Copier Constructor Syntaxe

Qu'est-

: m_nSize(sizeof(t1)) 

signifie dans la section suivante?

class CTypeSize 
{ 
    public: 
     template<class T> 
     CTypeSize(const T &t1) : 
     m_nSize(sizeof(t1)) 
     { 
     } 
     ~CTypeSize(void){ }; 
     int getSize(void) const{ return m_nSize; } 
    private: 
     const int m_nSize; 
}; 

Je comprends les constructeurs de copie, mais je me souviens de la syntaxe comme Class :: Class (classe const & p). Est-ce que je pense à autre chose ou est-ce une syntaxe alternative?

Merci!

Répondre

10

Il n'y a rien à copier avec ctor. Vous initialisez la variable m_nSize en utilisant la liste d'initialisation avec la taille de l'argument template t1.

3

Il est impossible d'initialiser une variable membre directement dans la définition de classe. C'est ce qu'on appelle la liste d'initialisation. Vous pouvez l'imaginer comme quelque chose comme:

const int m_nSize = sizeof(t1); 

C++ 0x permet d'ailleurs la forme ci-dessus.

1

CTypeSize (const T & t1) est le constructeur de la classe. Les membres de la classe peuvent être initialisés dans le constructeur.

classe testclass {// constructeur: a, b, c sont mis à // 0, 1, 2 testclass(): a (0), b (1), c (2) { }

int a, b, c; // membres }; Dans votre exemple, ": m_nSize (sizeof (t1))" signifie que m_nSize est initialisé avec la valeur de sizeof (t1).

1

Votre question est double:

La syntaxe : member(value) Initialise membre d'un nouvel objet à value.

Mais template< typename T> Class(const T&) est et non le constructeur de copie. Celui-là est Class(const Class&).

Alors

#include <iostream> 
struct C { 
    template< typename T > 
    C(const T& t) { std::cout << "T"; } 

    // C(const C& c) { std::cout << "C"; } 
}; 

int main() { C c1(1); C c2(c1); } 

Entraînera dans le constructeur de modèle à appeler, suivi de la « synthèse » constructeur de copie (. Affichera juste « T »)

Lorsque vous insérez explicitement le constructeur de copie , celui-là sera appelé (la sortie sera "TC").

0

Il y a une chose de plus importante concernant la déclaration de la variable membre CTypeSize::m_nSize. Avez-vous remarqué un modificateur const dans cette déclaration?

class member-var declared as "const" peut être initialisé uniquement dans la liste d'initialisation.Comme AraK l'a mentionné, dans C++ 11, const member-var peut également être initialisé avec l'expression const. C'est un cas de compilation, tandis que la liste d'initialisation permet d'initialiser const-var à l'exécution.