Ограничения на использование локальных переменных в C++?
У меня было несколько вопросов в техническом интервью, которое я думал, что знаю, но хотел дважды проверить (они сказали, что я прошел его, но я не был уверен в этом):
переменная, объявленная внутри метода класса... Может ли это использоваться вне этого метода, например, в другом методе? (Я сказал Нет)
может ли переменная, объявленная внутри метода, быть передана в качестве параметра другому методу? (Я сказал Да, но я не конечно)
Это для позиции начального уровня C++, и я привык к C, поэтому я хотел дважды проверить свое понимание концепций C++/OO.
6 ответов
переменная в методе класса, которая создается в этом методе и полностью содержится в этом методе, может использоваться только в этом методе. Его жизнь конечна. редактировать: чтобы уточнить, я не говорю, что он не может быть передан другому вызову функции в области функции, и я не говорю о создании экземпляра переменной-члена или статической переменной.
Да, вы можете передать его другому методу, если этот метод вызывается она существует изнутри метода. Почему? Поскольку его время жизни привязано к родительскому методу, а не к тому, который вызывается изнутри метода.
позвольте мне проиллюстрировать:
//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
обычно переменной жизни внутри блока она объявлена. Поэтому в конце прицела он уничтожается.
но вот случай Статическая Локальная Переменная который объявляется внутри метода, но значение сохраняется в памяти после завершения блока. Каждый вызов этой функции будет "видеть" значение этой переменной. Итак, у вас может быть вопрос с подвохом, что переменная CAN использоваться в другом экземпляре этот метод.Да, вы можете передать его.
Вопреки распространенному мнению, переменная, объявленная в функции-члена 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?
абсолютно.