С ++ переменная область - PullRequest
1 голос
/ 06 ноября 2010
// 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?

}

Ответы [ 2 ]

7 голосов
/ 06 ноября 2010
  1. Делает ли это повторное объявление равным _a равному неизвестному значению?

Нет.Это не «повторное объявление».Это объявление локальной переменной с именем _a.Это неинициализировано.

Он не имеет никакого отношения к переменной члена класса _a.После объявления локальной _a вы больше не можете получить доступ к переменной-члену _a, используя _a (потому что _a относится к локальной переменной!), Но вы можете обратиться к ней, используя this->_a.

  1. Выходит ли из области видимости после возврата foo()?

Да.Локальные переменные выходят из области видимости, когда заканчивается область, в которой они объявлены (из этого вытекает «выход из области видимости»).

1 голос
/ 06 ноября 2010

Это то, что называется shadowing .foo() локальный указатель _a скрывает указатель члена класса с тем же именем.Учитывая, что foo() является членом класса, любая ссылка на _a будет преобразована в локальный указатель.Более того, как и любая переменная в области видимости, этот указатель автоматически уничтожает себя, когда выходит из области видимости.Само собой разумеется, что указатель на член будет оставаться в живых до тех пор, пока активен его собственный экземпляр.

Для доступа к данным члена вам нужно будет сказать this->_a.

...