Ограничения на использование локальных переменных в C++?

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

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

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


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

6 ответов


  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. обычно переменной жизни внутри блока она объявлена. Поэтому в конце прицела он уничтожается.
    но вот случай Статическая Локальная Переменная который объявляется внутри метода, но значение сохраняется в памяти после завершения блока. Каждый вызов этой функции будет "видеть" значение этой переменной. Итак, у вас может быть вопрос с подвохом, что переменная CAN использоваться в другом экземпляре этот метод.

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


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

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

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

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


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

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


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

В C++ нет.

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

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


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?

абсолютно.