Então, enquanto eu faço algumas compilações longas, decidi fazer o teste geral do C ++ no ODesk e me deparei com essa pergunta.
Se não me engano, dada a redação (ou a falta dela), tudo isso pode ser verdade.
uma.
int Foo() { }
int Foo(int bar) { }
b.
Bem, return void;
seria incorretamente semanticamente, mas as funções podem obviamente ter void
tipos de retorno.
void Foo() { }
c. Esta é a definição de funções embutidas, sim.
d. Sem entrar em muitos detalhes sobre o posicionamento dos seguintes elementos,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Além disso, você sempre pode fazer isso usando lambdas e functors .
e
void Foo(int& bar)
{
++bar;
}
int foobar = 5;
Foo(foobar);
f.
int bar = 5;
int& GetBar()
{
return bar;
}
GetBar() = 6;
g.
int bar = 5;
int* GetBar()
{
return &bar;
}
(*GetBar()) = 5;
Não vejo onde esta pergunta tem respostas realmente falsas . Estou esquecendo de algo?
Escusado será dizer que fiquei sem tempo e falhei na coisa toda. Eu acho que sou um mau programador de C ++. :(
Respostas:
Essa questão toda é desonesta. A declaração da pergunta implica a possibilidade de várias opções, enquanto os botões de opção indicam uma única opção.
Além disso, b é bastante suspeito, pois as funções void não retornam nada.
D também é questionável, pois, tanto quanto eu sei, você não pode ter uma matriz de funções. Claro, você pode ter uma variedade de indicadores de função, mas isso não é exatamente a mesma coisa.
fonte
int
. Claro, se você lançá-lo para um ponteiro e que ponteiro se refere a uma função ...void
funções não retornem nenhum valor , elas ainda retornam o tipovoid
. Assim, eu digo que B é verdadeiro.return void;
, mas simreturn;
.A resposta c) também é indiscutivelmente falsa.
"As funções embutidas são expandidas durante o tempo de compilação para evitar sobrecarga de chamada."
Em primeiro lugar, o compilador C ++ tem permissão para ignorar a
inline
dica, não expandindo as funções.Em segundo lugar, a "razão" declarada para fazer a expansão é uma simplificação excessiva. De fato, a verdadeira razão para fazer a expansão (ou não) está inteiramente nas mãos do escritor do compilador.
fonte
inline
dica.Isso não está completamente certo.
Apesar do nome, a palavra-chave
inline
não garante que uma função seja incorporada. A única coisa que você pode ter certeza é que o compilador não irá reclamar se vir a definição de uma função embutida várias vezes.Portanto, estritamente falando, a opção C está incorreta, mas não acho que seja a resposta que os autores do questionário esperam, porque há uma resposta ainda mais errada.
No seu exemplo,
functions
há uma matriz de ponteiros para funções e não uma matriz de funções em si. Da mesma forma, lambdas e functors também não são realmente funções. São classes que respondem ao operador de chamada de função, mas que não as fazem funcionar aos olhos da definição de linguagem C ++.As funções em C ++ são um pouco como os cidadãos de segunda classe. Você pode defini-los e chamá-los, mas assim que tentar fazer outra coisa com um tipo de função (como criar uma matriz deles), você receberá um erro ou eles se converterão silenciosamente em um ponteiro.
fonte
c
como funções que já foram marcadas positivamente para inlining, versus ainline
própria palavra-chave. Eu entendoinline
é uma dica.Se alguma coisa, teria que ser b . Você não pode
return
umvoid
, mas você pode retornar umnull
. O nulo na declaração da função deve estar presente para notificar o compilador da falta de um valor retornado.Tipo de Vazio
fonte
void
funções não retornem nenhum valor , elas ainda retornam o tipovoid
. Assim, eu digo que B é verdadeiro.