2010-07-11 7 views
0

J'ai une classe qui n'a qu'une fonction "Print()" et deux propriétés "age, sex". Et j'essaie de comprendre quand l'objet crée-t-il sur la mémoire?Toujours créer une instance de classe?

Je peux toujours accéder aux accessoires et fonctions de l'objet même si je n'ai pas appelé sa fonction de constructeur.

N'existe-t-il aucune règle pour l'objet de création de la classe?

En C# ceci ne crée pas l'objet de la mémoire: ClassName cls; Mais cela va créer: ClassName cls = new ClassName(); En C++ est-il possible de ne pas créer objet en mémoire jusqu'à ce que je dois l'appeler est fonction constructeur?

#include <QtCore/QCoreApplication> 
#include "iostream" 

using namespace std; 

class ClassName{ 
public: 
    void print(){ 
     cout<< "Age: " <<age <<endl; 
     cout<< "Sex: " <<sex <<endl; 
    } 
    int age; 
    char sex; 


}; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    ClassName *ex1 = new ClassName(); 
    ex1->print(); 

    ClassName ex2; 
    ex2.print(); 

    ClassName ex3= {10,'e'}; 
    ex3.print(); 

    ClassName exCopy(ex3); 
    exCopy.print(); 

    return a.exec(); 
} 
+6

Je ne comprends pas ce que vous demandez. –

+2

Demandez-vous pourquoi les quatre méthodes différentes que vous avez postées aboutissent toutes à des objets valides lorsque vous n'avez défini explicitement aucun constructeur? – Troubadour

Répondre

2

En C# cette willn't créer objet sur la mémoire: className cls; Mais cela va créer: ClassName cls = new ClassName(); En C++ existe-t-il un moyen de ne pas créer d'objet en mémoire tant que je n'ai pas besoin d'appeler sa fonction constructeur?

L'équivalent à votre exemple C#, en utilisant C++, est la suivante:

//pointer to ClassName, not initialized 
ClassName* cls1; 
//alternatively 
ClassName* cls2 = 0; 
//initialize after declaring it but before using it 
cls1 = new ClassName(); 
cls1->print(); 
//after initializing it, don't forget to delete it again later 
delete cls1; 
cls1 = 0; 
//this is an error (using uninitialized pointer) 
cls2->print(); 

classes C# sont les types de 'référence', qui sont comme 'pointer' C++ types.

+0

C'est un très bon point: "Les classes C# sont des types 'référence', qui sont comme les types 'pointeurs' C++." – uzay95

+0

-1: Ceci n'est en fait pas l'équivalent d'une référence C#. Une référence C# est gérée par le garbage collector, ce qui n'est pas le cas ici. L'application doit gérer la mémoire par elle-même (comme le souligne @Neils). –

+0

@ Space_C0wb0y Vous avez raison: ils sont comme des types de pointeurs de plusieurs façons (par exemple, ils peuvent être nuls et doivent être initialisés), mais pas de toutes les façons (par exemple, ils sont collectés ordures alors que les pointeurs C++ ne sont pas.). – ChrisW

4

Je ne suis pas sûr de ce que vous demandez, exactement, mais nous espérons que l'exposition suivante contient la réponse que vous recherchez.

Variables ex1, ex2, ex3 et exCopy sont tous associés à instanciations distincts de ClassName.

  1. ex1 pointe vers une instance allouée par segment. Comme vous n'appelez jamais delete dessus, l'instance fuit à la sortie du programme, ce qui n'a pas beaucoup d'importance dans ce cas, mais pourrait causer des problèmes si ClassName avait un destructeur non trivial qui devait être appelé avant la sortie.
  2. ex2 est une instance de pile initialisée par défaut, qui aura, à toutes fins utiles, des valeurs aléatoires dans age et sex.
  3. ex3 est une instance de pile initialisée par un membre.
  4. exCopy est une instance de pile construite en copie.
2

en C++ est-il possible de ne pas créer l'objet en mémoire jusqu'à ce que je dois appeler sa fonction constructeur?

Oui - créer dynamiquement:

ClassName * p = 0; // nothing created 
...     // wait a bit 
p = new ClassName; // create instance 
...     // wait a bit 
delete p;   // get rid of it 
0

Donc, ce que vous demandez est: "Comment puis-je créer une référence non liée en C++?"- Eh bien, vous pouvez le faire uniquement avec des pointeurs, soit un pointeur simple, ou un pointeur intelligent comme Boostsshared_ptr, qui devrait être préféré

{ 
    tr1::shared_ptr<ClassName> p; // p is a NULL-pointer 

    p.reset(new ClassName()); // now a new object is created on the heap and p points to it. 
} // no delete needed, shared_ptr counts references and deletes object when no more reference exis 
0

En C++ est-il possible de ne pas créer objet. mémoire jusqu'à ce que je dois l'appeler est fonction constructeur?

il est possible d'allouer la mémoire d'abord, puis initialiser plus tard l'objet. est-ce que vous voulez dire?

unsigned char memory[sizeof(ClassName)]; 

// ... 

ClassName* p = new(memory) ClassName(); 
p->print(); 

// ... 

p->~ClassName(); 

(Même si je suis sûr que ce n'est pas ce que vous voulez.)

+0

C'est aussi une très bonne information pour les débutants comme moi. Merci pour votre aimable et très bonne réponse. – uzay95

+0

Notez qu'à moins de réinventer 'std :: vector', il est peu probable que vous ayez besoin de connaître ce genre de choses. – fredoverflow

Questions connexes