2011-01-27 23 views
6

tenía unas cuantas preguntas en una entrevista técnica que yo creía que sabía, pero quería una doble comprobación (decían lo pasé, pero yo estaba seguro acerca de estos):Restricciones en el uso de variables locales en C++?

  1. una variable declarada dentro de una Método de clase ... ¿Se puede usar eso fuera de ese método, como por ejemplo en otro método? (Dije no)

  2. ¿Se puede pasar una variable declarada dentro de un método como parámetro a otro método? (me dijeron que sí, pero que no estaba seguro)


Esto es para una posición de nivel de entrada C++ y estoy acostumbrado a C, así que quería volver a verificar mi entendimiento de los conceptos C++/OO.

+4

Tal vez es una entrevista para una pasantía. Tal vez él es competente con otros idiomas y planean enseñarle C++. Él nunca dijo qué era la entrevista * para *. – James

+5

Acaba de graduarse o está en proceso de graduarse. C++ es un lenguaje desalentador con un enfoque de fregadero de cocina de tirar todo. Para las primeras entrevistas está perfectamente bien dudar de ti mismo. No encontrar la respuesta, al preguntar por SO, es peor que preguntarlo. Alguien que está dispuesto a preguntar y aprender vale más que 1000 ingenieros que son seguros pero estúpidos. – wheaties

+0

Guau, estoy contento de que todos sean tan comprensivos aquí. A pesar de todo, yo estaba CORRECTO básicamente en mis dos respuestas, y es para una posición de nivel de Entrada. Así que sí, nivel principiante, pero ... posición de nivel de ENTRADA. Solo estaba comprobando dos veces –

Respuesta

4
  1. Una variable dentro de un método de clase, que está instanciada dentro de ese método y totalmente contenida dentro de ese método, solo se puede usar con ese método. Su tiempo de vida es finito. Editar: para aclarar, no estoy diciendo que no se puede pasar a otra llamada de función dentro del alcance de la función y no estoy hablando de instanciar una variable miembro o una variable estática.

  2. Sí, puede pasarlo a otro método si se llama a ese método desde el método que existe. ¿Por qué? Debido a que su duración está ligada al método principal, no al que se llama desde el método.

Permítanme ilustrar:

//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 
+0

variables estáticas, punteros y clases con los constructores pertinentes y operator = se puede acceder desde fuera de la función (si se pasa). –

+0

@Chris Lutz es por eso que dije totalmente de propiedad y contenido ... Oh, veo la confusión. – wheaties

+0

Gracias en primer lugar por A. No ser un idiota al responderme, y B. Explicar y usarlo en contexto. Sentí que estaba en lo cierto, pero siempre quise estar seguro. –

0

Primera Pregunta: Sí, estás en lo correcto. Las variables declaradas dentro del alcance de un método de clase solo son válidas en ese alcance. Cuando el método sale, esa variable pierde alcance y ya no es utilizable.

Segunda pregunta: Sí, el método puede llamar a otro método, utilizando esa variable de ámbito local. La variable permanece en el alcance y se puede usar durante la duración de la segunda llamada a la función.

0

Primero de todo ..... una variable declarada dentro de un método de clase .... puede ser que utilizarse fuera de dicho método, como por ejemplo en otro método

En C++, no.

En segundo lugar, puede una variable declarada dentro de un método ser pasado como un parámetro para otro método?

En C++, en una aplicación no concurrente, sí. En el caso de concurrencia y la función de recepción toma su parámetro por referencia, debe asegurarse de que el objeto que pase no se destruya mientras la función receptora lo utilice.

1
  1. Normalmente, la vida útil de una variable se encuentra dentro del bloque en el que está declarada.Entonces, al final del alcance, se destruye.
    PERO está el caso de variable estática local que se declara dentro de un método, pero el valor se guarda en la memoria después de finalizar el bloque. Cada llamada a esa función "verá" el valor de esa variable. Por lo tanto, podría tener una pregunta trampa, que la variable CAN se puede utilizar en otra instancia de ese método.

  2. Sí puede pasarlo.

1

Contrariamente a la creencia popular, una variable declarada en una función miembro puede usarse en otra función miembro. Hay dos rutas obvias para esto.

El primero es si esa función miembro llama a otra función miembro, pasando un puntero o referencia a esa variable a la segunda función miembro. La variable existe desde el momento en que se llama a la primera función miembro hasta que sale de esa llamada; si llama a alguna otra función durante ese tiempo, ese otro código puede usar la variable (si la función miembro hace algo para darle acceso).

El segundo es si usted está tratando con una variable estática se define en una función miembro. Esto es (por un ejemplo) la esencia del singleton de Meyers. Una variable estática se define en una función miembro, y no solo en otros miembros del singleton, sino que de hecho todo el resto del programa que accede al objeto singleton usa la variable estática definida en esa función miembro.

Para la segunda pregunta, tiene razón: una variable definida en una función miembro es muy parecida a cualquier otra variable local. Se puede pasar como un parámetro, como cualquier otra cosa.

0
First of all.....a variable declared inside a Class Method.... 
can that be used outside of that method, 
like for instance in another method 

Sure. Por ejemplo,

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; 
}; 

Tenga en cuenta que variable_declared_inside_class_method no se vive en la pila. Es por eso que funciona aquí.

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

Absolutamente.

Cuestiones relacionadas