Ограничения на использование локальной переменной в C ++? - PullRequest
6 голосов
/ 28 января 2011

У меня было несколько вопросов в техническом интервью, которое я думал, что знаю, но хотел перепроверить (они сказали, что я его прошел, но я не был уверен в этом):

  1. Переменная, объявленная внутри метода класса ... Может ли она использоваться вне этого метода, как, например, в другом методе? (я сказал нет)

  2. Может ли переменная, объявленная внутри метода, передаваться в качестве параметра другому методу? (я сказал да, но я не был уверен)


Это для позиции C ++ начального уровня, и я привык к C, поэтому я хотел еще раз проверить мое понимание концепций C ++ / OO.

Ответы [ 6 ]

4 голосов
/ 28 января 2011
  1. Переменная в методе класса, которая создается в этом методе и полностью содержится в этом методе, может использоваться только в этом методе. Его время жизни конечно. Редактировать : чтобы уточнить, я не говорю, что он не может быть передан другому вызову функции в пределах области действия функции, и я не говорю о создании экземпляра переменной-члена или статической переменной.

  2. Да, вы можете передать его другому методу, если этот метод вызывается из существующего метода. Зачем? Поскольку время его жизни связано с родительским методом, а не с тем, который вызывается из метода.

Позвольте мне проиллюстрировать:

//aVar does not exist.
int foo(){
   int aVar = 1; //it's been born
   cout << doSomething(aVar); // still alive

   return aVar; //still alive but a copy is being returned from the function.  Not aVar itself!
} // it's dead, man
1 голос
/ 28 января 2011

Вопреки распространенному мнению, переменная, объявленная в функции-члене , может использоваться в другой функции-члене.Есть два очевидных пути к этому.

Первый - если эта функция-член вызывает другую функцию-член, передавая указатель или ссылку на эту переменную второй функции-члену.Переменная существует с момента вызова первой функции-члена до ее выхода из этого вызова;если он вызывает какую-то другую функцию в течение этого времени, этот другой код может использовать переменную (если функция-член делает что-то, чтобы предоставить ей доступ).

Второй - если вы имеете дело со статической переменная, определенная в функции-члене.Это (для одного примера) сущность синглтона Мейерса.Статическая переменная определена в функции-члене, и не только в других членах синглтона, но фактически во всей остальной программе, которая обращается к одноэлементному объекту, используется статическая переменная, определенная в этой функции-члене.

Длявторой вопрос, вы правы - переменная, определенная в функции-члене, очень похожа на любую другую локальную переменную.Его можно передать как параметр, как и все остальное.

1 голос
/ 28 января 2011
  1. Обычно время жизни переменной находится внутри блока, в котором она объявлена. Поэтому в конце области видимости она уничтожается.
    НО есть случай Статическая локальная переменная , которая объявлена ​​внутри метода, но значение сохраняется в памяти после завершения блока. Каждый вызов этой функции будет «видеть» значение этой переменной. Таким образом, у вас может возникнуть хитрый вопрос, что переменную CAN можно использовать в другом экземпляре этого метода.

  2. Да, вы можете передать его.

0 голосов
/ 28 января 2011
First of all.....a variable declared inside a Class Method....
can that be used outside of that method, 
like for instance in another method

Конечно.Например,

class Base {
 public:
  static Base *create_instance() {
    static int variable_declared_inside_class_method = 0;
    return new Base(variable_declared_inside_class_method);
  }

  Base(int &var_) : var(var_) {}

  int inc_var() {
    var++;  // this method uses variable_declared_inside_class_method 
  }

 private:
  int &var;
};

Обратите внимание, что variable_declared_inside_class_method не находится в стеке.Вот почему это работает здесь.

Secondly, can a variable declared inside a method be passed as a parameter 
for another method?

Абсолютно.

0 голосов
/ 28 января 2011

Прежде всего ..... объявленная переменная внутри метода класса .... это может быть используется вне этого метода, как для экземпляр в другом методе

В C ++ нет.

Во-вторых, может ли объявленная переменная внутри метода передаваться как параметр для другого метода?

В C ++, в не параллельном приложении, да. В случае параллелизма, когда принимающая функция принимает свой параметр по ссылке, вы должны убедиться, что передаваемый вами объект не разрушается, пока получающая функция его использует.

0 голосов
/ 28 января 2011

Первый вопрос: Да, вы правы. Переменные, объявленные в рамках метода класса, действительны только в этой области. Когда метод завершается, эта переменная теряет область видимости и больше не может использоваться.

Второй вопрос: Да, метод может вызывать другой метод, используя эту локальную переменную. Переменная остается в области видимости и может использоваться во время второго вызова функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...