web-dev-qa-db-fra.com

Pointeurs d'objets de classe C++ et accès aux fonctions membres

Je suis un peu nouveau en C++ et j'essaie de travailler avec Qt et je suis tombé sur cette chose déroutante:

Les concepts de divers tutoriels énoncent quelque chose comme:

Class *obj;

*obj - affichera la valeur de l'objet stocké dans la mémoire référencée
obj - sera l'adresse de la mémoire vers laquelle elle pointe

alors, je ferais quelque chose comme

*obj=new Class();

mais si je veux accéder à une fonction, je dois faire obj->function1(); au lieu de *obj->function1();

- je ne sais pas pourquoi, car avec les objets normaux [normalObj.function1();] fonctionnerait, puisque c'est la valeur directement.

Ainsi, pour les objets pointeurs, pourquoi utilisons-nous des références mémoire pour accéder à la fonction, .__ ou est-ce que, dans le cas d'objets normaux également, ses références toujours

P.S: Quelqu'un peut-il me guider vers un bon tutoriel sur l'utilisation des pointeurs en C++, afin que mes requêtes de ce type puissent y être directement adressées?.

12
rock_win

Le symbole * sert à définir un pointeur et à déréférencer un pointeur. Par exemple, si je voulais créer un pointeur sur un int, je pourrais faire:

int *ptr;

Dans cet exemple, le * est utilisé pour déclarer qu'il s'agit d'un pointeur vers un int . Désormais, lorsque vous ne déclarez pas de pointeur et que vous utilisez le symbole * avec un pointeur déjà déclaré, vous le déréférenciez. Comme vous le savez probablement, un pointeur est simplement une adresse. Lorsque vous déréférencez un pointeur, vous obtenez la valeur indiquée par cette adresse. Par exemple:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr;

5. Si vous assignez un pointeur à une nouvelle adresse et que celle-ci ne figure pas dans la déclaration, vous utilisez pas utilisez le symbole *. Alors:

int pointToMe = 5;
int *ptr;
ptr = &pointToMe;

voici comment vous le feriez. Vous pouvez également déférencer le pointeur pour attribuer une nouvelle valeur à la valeur pointée par l'adresse. Tel que:

int pointToMe = 5;
int *ptr = &pointToMe;
std::cout << *ptr; // Prints out 5
*ptr = 27;
std::cout << *ptr; // Prints out 27

Maintenant, -> agit comme le symbole de déférence. Il déréférencera le pointeur et utilisera ensuite les fonctions membres et les variables comme si vous aviez utilisé . avec un objet non-pointeur. Même avec un objet qui n'est pas un pointeur, vous pouvez utiliser le -> en obtenant d'abord l'adresse:

CObj object;
(&object)->MemberFunction();

Ceci est juste un bref aperçu des pointeurs, espérons que cela aide.

27
Yokatta24

En fait, vous avez tort. Tu fais:

obj=new Class();

ou

Class *obj = new Class;

qui sont complètement différents.

Class *obj;
*obj = new Class;

ne pas compiler.

obj est de type Class*, c'est donc ce que vous pouvez lui affecter (et ce que new Class renvoie).

3
Luchian Grigore

Vous pouvez utiliser le . "normal" pour accéder aux objets membres, mais vous devez d'abord déréférencer le pointeur.

En raison de la priorité des opérateurs, ceci ressemblera à (*obj).member. Pour ceux qui pensent que c'est trop écrire, obj->member est une alternative plus courte.

Si vous avez un objet c de type Class, *c.ptr signifie le déréférencement d'un pointeur ptr membre de Class. C'est l'une des raisons pour (*obj).member, qui signifie autre chose.

3
Bo Persson

Plus précisément tu peux faire comme ça 

Class  obj;
Class* obj_ptr;

obj_ptr = &obj;

// Now onwards you can use the pointer to access data members and function

obj_ptr->a = 10; // Like this
1
Vikas Rao