Dlatego podczas długich kompilacji zdecydowałem się na ogólny test C ++ na ODesk i natknąłem się na to pytanie.
Jeśli się nie mylę, biorąc pod uwagę sformułowanie (lub jego brak), wszystkie z nich mogą być prawdziwe.
za.
int Foo() { }
int Foo(int bar) { }
b.
Cóż, return void;
byłoby niepoprawne semantycznie, ale funkcje mogą oczywiście mieć void
typy zwracane.
void Foo() { }
do. To jest definicja funkcji wbudowanych, tak.
re. Bez wchodzenia w szczegółowe informacje na temat rozmieszczenia następujących elementów,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Ponadto zawsze można to zrobić za pomocą lambd i funktorów .
mi.
void Foo(int& bar)
{
++bar;
}
int foobar = 5;
Foo(foobar);
fa.
int bar = 5;
int& GetBar()
{
return bar;
}
GetBar() = 6;
sol.
int bar = 5;
int* GetBar()
{
return &bar;
}
(*GetBar()) = 5;
Nie widzę, gdzie to pytanie ma naprawdę fałszywe odpowiedzi. Czy coś brakuje?
Nie trzeba dodawać, że zabrakło mi czasu i wszystko mi się nie udało. Chyba jestem złym programistą C ++. :(
Odpowiedzi:
Całe to pytanie jest niejasne. Zestawienie pytań sugeruje możliwość wielokrotnego wyboru, a przyciski opcji wskazują jeden wybór.
Co więcej, b jest dość podejrzane, ponieważ funkcje void niczego nie zwracają.
D jest również wątpliwe, ponieważ o ile mi wiadomo, nie możesz mieć szeregu funkcji. Jasne, możesz mieć tablicę wskaźników funkcji, ale to nie jest dokładnie to samo.
źródło
int
. Jasne, jeśli rzucisz go na wskaźnik, a ten wskaźnik odnosi się do funkcji ...void
funkcje nie zwracają żadnej wartości , nadal zwracają typvoid
. Dlatego mówię, że B jest prawdą.return void;
, ale zamiast tegoreturn;
.Odpowiedź c) jest również prawdopodobnie fałszywa.
„Funkcje wbudowane są rozszerzane podczas kompilacji, aby uniknąć narzutu wywołania”.
Po pierwsze, kompilator C ++ może ignorować
inline
podpowiedź, nie rozszerzając wcale funkcji.Po drugie, podany „powód” ekspansji jest nadmiernym uproszczeniem. W rzeczywistości prawdziwy powód dokonania rozszerzenia (lub nie) jest całkowicie w rękach autora kompilatora.
źródło
inline
podpowiedź.To nie do końca prawda.
Mimo nazwy słowo kluczowe
inline
nie gwarantuje wstawienia funkcji. Jedyne, czego możesz być pewien, to to, że kompilator nie narzeka, jeśli zobaczy definicję funkcji wbudowanej wiele razy.Tak więc, ściśle mówiąc, opcja C jest niepoprawna, ale nie sądzę, że jest to odpowiedź, której oczekują autorzy quizu, ponieważ istnieje odpowiedź, która jest jeszcze bardziej błędna.
W twoim przykładzie
functions
jest tablica wskaźników do funkcji, a nie tablica samych funkcji. Podobnie lambdy i funktory też nie są tak naprawdę funkcjami. Są to klasy, które odpowiadają operatorowi wywołania funkcji, ale to nie czyni ich funkcjami w oczach definicji języka C ++.Funkcje w C ++ są trochę jak obywatele drugiej kategorii. Możesz je zdefiniować i wywołać, ale gdy tylko spróbujesz zrobić coś innego z typem funkcji (np. Utworzyć ich tablicę), albo pojawi się błąd, albo dyskretnie przekonwertują się we wskaźniku.
źródło
c
jako funkcje, które zostały już pozytywnie oznaczone do wstawiania, w porównaniu doinline
samego słowa kluczowego. Rozumiem, żeinline
to podpowiedź.Jeśli cokolwiek, musiałoby to być b . Nie można , ale można zwróci . W deklaracji funkcji powinna znajdować się pustka, aby powiadomić kompilator o braku zwracanej wartości.
return
void
null
Typ pustki
źródło
void
funkcje nie zwracają żadnej wartości , nadal zwracają typvoid
. Dlatego mówię, że B jest prawdą.