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

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

les concepts des différents tutoriels indiquent quelque chose comme:

Class *obj;

*obj - affiche la valeur de l'objet stocké à l'référencé la mémoire

obj - sera l'adresse de la mémoire à laquelle il est pointé

donc, je voudrais faire quelque chose comme

*obj=new Class();

mais si je veux accéder à une fonction, je dois faire obj->function1(); plutôt *obj->function1();

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

donc, pour les objets pointeurs pourquoi utilisons - nous la référence de mémoire pour accéder à la fonction, ou est-ce que dans le cas d'objets normaux aussi, ses références toujours

P. S: est-ce que quelqu'un peut me guider vers un bon tutoriel d'utilisation des pointeurs en C++, de sorte que mes requêtes comme celles-ci puissent y être directement adressées.

10
demandé sur Arun A S 2012-07-07 11:27:07

4 réponses

* symbole est utilisé pour définir un pointeur et de déréférencer un pointeur. Par exemple, si je voulais créer un pointeur vers un int, je pourrais faire:

int *ptr;

Dans cet exemple,* est utilisé pour déclarer que c'est un pointeur vers un int. Maintenant, quand vous ne déclarez pas un pointeur et que vous utilisez le * symbole avec un pointeur déjà déclaré, alors vous le déréférenciez. Comme vous le savez probablement, un pointeur est tout simplement un adresse. Lorsque vous déréférenciez un pointeur, vous obtenez la valeur qui est pointée par cette adresse. Par exemple:

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

imprimer 5. Aussi, si vous assignez un pointeur à une nouvelle adresse et que ce n'est pas dans la déclaration, vous faites * symbole. Donc:

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

est la façon dont vous le feriez. Vous pouvez également déférence le pointeur d'affecter une nouvelle valeur à la valeur pointée par l'adresse. Tel comme:

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 et variables de membre 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();

ce n'est qu'un bref aperçu des pointeurs, j'espère que ça vous aidera.

25
répondu Yokatta24 2012-07-07 08:40:38

en Fait, vous avez tort. Vous faire:

obj=new Class();

ou

Class *obj = new Class;

qui sont complètement différentes.

Class *obj;
*obj = new Class;

ne compilerait pas.

obj est de type Class*, c'est ce que vous pouvez attribuer à elle (et ce new Class retourne).

3
répondu Luchian Grigore 2012-07-07 07:29:16

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

en Raison de la priorité de l'opérateur, cela va ressembler à (*obj).member. Pour ceux qui pense que c'est trop à écrire, obj->member est une alternative plus courte.

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

3
répondu Bo Persson 2012-07-07 08:18:47

Plus précisément vous pouvez faire comme ceci

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
0
répondu Vikas Rao 2015-08-18 07:02:22