Während ich einige lange Kompilierungen durchgeführt habe, habe ich mich für den allgemeinen C ++ - Test auf ODesk entschieden und bin auf diese Frage gestoßen.
Wenn ich mich nicht irre, könnte angesichts des Wortlauts (oder des Fehlens davon) alles wahr sein.
ein.
int Foo() { }
int Foo(int bar) { }
b.
Nun, return void;
wäre semantisch falsch, aber Funktionen können offensichtlich void
Rückgabetypen haben .
void Foo() { }
c. Dies ist die Definition von Inline-Funktionen, ja.
d. Ohne näher auf die Platzierung der folgenden Elemente einzugehen,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Außerdem können Sie dies immer mit Lambdas und Funktoren tun .
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;
Ich verstehe nicht, wo diese Frage wirklich falsche Antworten hat. Vermisse ich etwas?
Unnötig zu erwähnen, dass mir die Zeit ausgegangen ist und das Ganze gescheitert ist. Ich denke, ich bin ein schlechter C ++ - Programmierer. :(
Antworten:
Diese ganze Frage ist zweifelhaft. Die Frage beinhaltet die Möglichkeit der Mehrfachauswahl, während die Optionsfelder eine einzige Auswahl angeben.
Außerdem ist b ziemlich verdächtig, da leere Funktionen nichts zurückgeben.
D ist auch fraglich, denn meines Wissens kann man keine Reihe von Funktionen haben. Sicher, Sie können eine Reihe von Funktionszeigern haben, aber das ist nicht genau dasselbe.
quelle
int
. Sicher, wenn Sie es auf einen Zeiger umwandeln und dieser Zeiger auf eine Funktion verweist ...void
Funktionen keinen Wert zurückgeben , geben sie dennoch den Typ zurückvoid
. Also sage ich, B ist wahr.return void;
, aber stattdessenreturn;
.Antwort c) ist wohl auch falsch.
Msgstr "Inline - Funktionen werden während der Kompilierung erweitert, um den Aufwand für den Aufruf zu vermeiden."
Erstens darf der C ++ - Compiler den
inline
Hinweis ignorieren, indem er die Funktionen überhaupt nicht erweitert.Zweitens ist der genannte "Grund" für eine Erweiterung eine zu starke Vereinfachung. Tatsächlich liegt der eigentliche Grund für die Erweiterung (oder auch nicht) ganz in den Händen des Compiler-Autors.
quelle
inline
Hinweises.Das ist nicht ganz richtig.
Trotz seines Namens
inline
garantiert das Schlüsselwort nicht, dass eine Funktion eingebettet wird. Sie können sich nur sicher sein, dass sich der Compiler nicht beschwert, wenn er die Definition einer Inline-Funktion mehrmals sieht.Streng genommen ist Option C also falsch, aber ich glaube nicht, dass die Autoren des Quiz diese Antwort erwarten, da es eine noch falschere Antwort gibt.
In Ihrem Beispiel
functions
handelt es sich um ein Array von Zeigern auf Funktionen und nicht um ein Array von Funktionen. Ebenso funktionieren Lambdas und Funktoren auch nicht wirklich. Dies sind Klassen, die auf den Funktionsaufrufoperator reagieren, die jedoch in den Augen der C ++ - Sprachdefinition nicht funktionieren.Funktionen in C ++ sind ein bisschen wie Bürger zweiter Klasse. Sie können sie definieren und aufrufen, aber sobald Sie versuchen, mit einem Funktionstyp etwas anderes zu tun (z. B. ein Array von ihnen zu erstellen), wird entweder ein Fehler angezeigt, oder sie konvertieren sich stillschweigend in einen Zeiger.
quelle
c
als Funktionen gelesen , die bereits positiv für das Inlining markiert wurden, im Vergleich zum eigentlicheninline
Schlüsselwort. Ich verstehe,inline
ist ein Hinweis.Wenn überhaupt, müsste es sein, b . Sie können nicht
return
avoid
, aber Sie können a zurückgebennull
. Die Funktionsdeklaration sollte ungültig sein, um den Compiler über das Fehlen eines zurückgegebenen Werts zu informieren.Leerart
quelle
void
Funktionen keinen Wert zurückgeben , geben sie dennoch den Typ zurückvoid
. Also sage ich, B ist wahr.