Donc, pendant que je fais de longues compilations, j'ai décidé de passer le test général C ++ sur ODesk et suis tombé sur cette question.
Si je ne me trompe pas, étant donné le libellé (ou son absence), tout cela pourrait être vrai.
une.
int Foo() { }
int Foo(int bar) { }
b.
Eh bien, ce return void;
serait sémantique incorrectement, mais les fonctions peuvent évidemment avoir des void
types de retour.
void Foo() { }
c. C'est la définition des fonctions en ligne, oui.
ré. Sans entrer dans les détails du placement des éléments suivants,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
De plus, vous pouvez toujours le faire en utilisant des lambdas et des foncteurs .
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;
Je ne vois pas où cette question a des réponses vraiment fausses . Suis-je en train de manquer quelque chose?
Inutile de dire que j'ai manqué de temps et que j'ai tout échoué. Je suppose que je suis un mauvais programmeur C ++. :(
Réponses:
Toute cette question est douteuse. L'énoncé de question implique la possibilité de choix multiples, tandis que les boutons radio indiquent un seul choix.
De plus, b est assez suspect, car les fonctions void ne renvoient rien.
D est également discutable, car pour autant que je sache, vous ne pouvez pas avoir un tableau de fonctions. Bien sûr, vous pouvez avoir un tableau de pointeurs de fonction, mais ce n'est pas exactement la même chose.
la source
int
. Bien sûr, si vous le transformez en un pointeur et que ce pointeur fait référence à une fonction ...void
fonctions ne renvoient aucune valeur , elles renvoient toujours le typevoid
. Je dis donc que B est vrai.return void;
, mais à la placereturn;
.La réponse c) est également sans doute fausse.
"Les fonctions en ligne sont étendues pendant la compilation pour éviter la surcharge d'appel."
Premièrement, le compilateur C ++ est autorisé à ignorer le
inline
indication en ne développant pas du tout les fonctions.Deuxièmement, la «raison» invoquée pour procéder à l'expansion est une simplification excessive. En fait, la vraie raison de faire l'expansion (ou non) est entièrement entre les mains du rédacteur du compilateur.
la source
inline
indice.Ce n'est pas tout à fait vrai.
Malgré son nom, le mot
inline
- clé ne garantit pas qu'une fonction sera insérée. La seule chose dont vous pouvez être sûr, c'est que le compilateur ne se plaindra pas s'il voit plusieurs fois la définition d'une fonction en ligne.Donc, à proprement parler, l'option C est incorrecte, mais je ne pense pas que ce soit la réponse que les auteurs du quiz attendent, car il y a une réponse encore plus fausse.
Dans votre exemple,
functions
est un tableau de pointeurs vers fonctions et non un tableau de fonctions elles-mêmes. De même, les lambdas et les foncteurs ne sont pas vraiment des fonctions non plus. Ce sont des classes qui répondent à l'opérateur d'appel de fonction, mais cela n'en fait pas des fonctions aux yeux de la définition du langage C ++.Les fonctions en C ++ sont un peu comme des citoyens de seconde classe. Vous pouvez les définir et les appeler, mais dès que vous essayez de faire autre chose avec un type de fonction (comme en créer un tableau), vous obtenez soit une erreur, soit ils se convertissent silencieusement en pointeur.
la source
c
comme des fonctions qui ont déjà été marquées positivement pour l'inline, par rapport auinline
mot-clé lui-même. Je comprendsinline
est un indice.Si quoi que ce soit, il faudrait que ce soit b . Vous ne pouvez pas
return
unevoid
, mais vous pouvez renvoyer unnull
. La déclaration de fonction doit être vide pour signaler au compilateur l'absence de valeur renvoyée.Type nul
la source
void
fonctions ne renvoient aucune valeur , elles renvoient toujours le typevoid
. Je dis donc que B est vrai.