Entonces, mientras hacía compilaciones largas, decidí hacer la prueba general de C ++ en ODesk y me encontré con esta pregunta.
Si no me equivoco, dada la redacción (o la falta de ella), todo esto podría ser cierto.
a.
int Foo() { }
int Foo(int bar) { }
si.
Bueno, return void;
sería incorrecto semánticamente, pero las funciones obviamente pueden tener void
tipos de retorno.
void Foo() { }
C. Esta es la definición de funciones en línea, sí.
re. Sin entrar en muchos detalles sobre la colocación de los siguientes elementos,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Además, siempre puedes hacer esto usando lambdas y functors .
mi.
void Foo(int& bar)
{
++bar;
}
int foobar = 5;
Foo(foobar);
F.
int bar = 5;
int& GetBar()
{
return bar;
}
GetBar() = 6;
sol.
int bar = 5;
int* GetBar()
{
return &bar;
}
(*GetBar()) = 5;
No veo dónde esta pregunta tiene respuestas verdaderamente falsas . ¿Me estoy perdiendo de algo?
No hace falta decir que se me acabó el tiempo y fallé todo. Supongo que soy un mal programador de C ++. :(
Respuestas:
Toda esta pregunta es dudosa. El enunciado de la pregunta implica la posibilidad de múltiples opciones, mientras que los botones de opción indican una sola opción.
Además, b es bastante sospechoso, ya que las funciones nulas no devuelven nada.
D también es cuestionable, por lo que yo sé, no puedes tener una variedad de funciones. Claro, puede tener una variedad de punteros de función, pero eso no es exactamente lo mismo.
fuente
int
. Claro, si lo lanzas a un puntero y ese puntero se refiere a una función ...void
funciones no devuelven ningún valor , aún devuelven el tipovoid
. Por eso digo que B es cierto.return void;
, pero en su lugarreturn;
.La respuesta c) también es posiblemente falsa.
"Las funciones en línea se expanden durante el tiempo de compilación para evitar la sobrecarga de la invocación".
En primer lugar, el compilador de C ++ puede ignorar la
inline
sugerencia al no expandir las funciones en absoluto.En segundo lugar, la "razón" declarada para hacer la expansión es una simplificación excesiva. De hecho, la verdadera razón para hacer la expansión (o no) está totalmente en manos del escritor compilador.
fuente
inline
pista.Eso no es completamente correcto.
A pesar de su nombre, la palabra clave
inline
no garantiza que una función esté en línea. Lo único de lo que puede estar seguro es que el compilador no se quejará si ve la definición de una función en línea varias veces.Entonces, estrictamente hablando, la opción C es incorrecta, pero no creo que sea la respuesta que esperan los autores del cuestionario, porque hay una respuesta que es aún más incorrecta.
En su ejemplo,
functions
es una matriz de punteros a funciones y no una matriz de funciones en sí. Del mismo modo, las lambdas y los functores tampoco son realmente funciones. Son clases que responden al operador de llamada a función, pero eso no las convierte en funciones a los ojos de la definición del lenguaje C ++.Las funciones en C ++ son un poco como los ciudadanos de segunda clase. Puede definirlos y llamarlos, pero tan pronto como intenta hacer algo más con un tipo de función (como crear una matriz de ellos), obtiene un error o se convierten silenciosamente en un puntero.
fuente
c
como funciones que ya se han marcado positivamente para la inclusión, en comparación con lainline
palabra clave en sí. Entiendo queinline
es una pista.En todo caso, tendría que ser b . No puedes
return
avoid
, pero puedes devolver anull
. Nulo en la declaración de función debe estar allí para notificar al compilador la falta de un valor devueltoTipo de vacío
fuente
void
funciones no devuelven ningún valor , aún devuelven el tipovoid
. Por eso digo que B es cierto.