2010-11-05 16 views
1
// declare a class with private variable “int * _a” 

// declare a function of this class, foo() 

Void foo() { 

int * _a; // 1. Does this re-declaration then make _a equal to an unknown value? 
      // 2. Does a go out of scope after foo() returns? 

} 
+1

Voulez-vous dire «void»? –

+0

Voulez-vous dire 'Klass :: foo()'? – wilhelmtell

+1

Veuillez écrire un code qui compile au moins. Comme écrit, non seulement le code est brisé, mais foo n'est pas une fonction membre d'une classe. – catphive

Répondre

7
  1. Est-ce que cette re-déclaration puis faire _a égale à une valeur inconnue?

Non, ce n'est pas une "nouvelle déclaration." C'est une déclaration d'une variable locale nommée _a. Il n'est pas initialisé.

Il n'a aucune relation avec la variable membre de la classe _a. Après la déclaration du _a local, vous ne pouvez plus accéder à la variable membre _a en utilisant _a (car _a fait référence à la variable locale!), Mais vous pouvez vous y référer en utilisant this->_a.

  1. Est-ce un hors de portée après foo() retours?

Oui. Les variables locales sortent de la portée lorsque l'étendue dans laquelle elles sont déclarées se termine (c'est de là que vient «sortir de la portée»).

1

Ceci est ce que l'on appelle l'observation. foo() le pointeur local _a ombrage le pointeur de membre de classe du même nom. Étant donné que foo() est un membre de la classe, toute référence à _a résoudrait au pointeur local. De plus, comme toute variable étendue, ce pointeur se détruit automatiquement lorsqu'il est hors de portée. Le pointeur de membre, inutile de le dire, restera vivant tant que sa propre instance sera vivante.

Pour accéder aux données de membre, vous devez dire this->_a.