Jadi, sementara saya telah melakukan beberapa kompilasi panjang saya memutuskan untuk mengambil tes umum C ++ di ODesk dan menemukan pertanyaan ini.
Jika saya tidak salah, dengan kata-kata (atau kekurangannya) semua ini bisa benar.
Sebuah.
int Foo() { }
int Foo(int bar) { }
b.
Yah, return void;
semantik akan salah tetapi fungsi jelas dapat memiliki void
tipe kembali.
void Foo() { }
c. Ini adalah definisi fungsi sebaris, ya.
d. Tanpa banyak detail tentang penempatan elemen-elemen berikut,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Selanjutnya, Anda selalu bisa melakukan ini menggunakan lambdas dan 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;
Saya gagal melihat di mana pertanyaan ini memiliki jawaban yang benar-benar salah . Apakah saya melewatkan sesuatu?
Tak perlu dikatakan saya kehabisan waktu dan gagal semuanya. Saya kira saya seorang programmer C ++ yang buruk. :(
Jawaban:
Seluruh pertanyaan ini cerdik. Pernyataan pertanyaan menyiratkan kemungkinan pilihan ganda, sedangkan tombol radio menunjukkan pilihan tunggal.
Selain itu, b cukup mencurigakan, karena fungsi void tidak mengembalikan apa pun.
D juga dipertanyakan, sejauh yang saya tahu, Anda tidak dapat memiliki berbagai fungsi. Tentu, Anda dapat memiliki berbagai fungsi pointer, tapi itu bukan hal yang persis sama.
sumber
int
. Tentu, jika Anda melemparkannya ke sebuah pointer dan pointer itu merujuk ke suatu fungsi ...void
fungsi tidak mengembalikan nilai apa pun , mereka tetap mengembalikan jenisnyavoid
. Jadi saya katakan B benar.return void;
, tetapi sebaliknyareturn;
.Jawaban c) juga bisa dibilang salah.
"Fungsi sebaris diperluas selama waktu kompilasi untuk menghindari overhead doa."
Pertama, kompiler C ++ diizinkan untuk mengabaikan
inline
petunjuk dengan tidak memperluas fungsi sama sekali.Kedua, "alasan" yang dinyatakan untuk melakukan ekspansi adalah penyederhanaan yang berlebihan. Faktanya, alasan sebenarnya untuk melakukan ekspansi (atau tidak) sepenuhnya ada di tangan penulis kompiler.
sumber
inline
petunjuknya.Itu tidak sepenuhnya benar.
Terlepas dari namanya, kata kunci
inline
tidak menjamin bahwa suatu fungsi akan digarisbawahi. Satu-satunya hal yang dapat Anda yakini adalah bahwa kompiler tidak akan mengeluh jika melihat definisi fungsi inline beberapa kali.Jadi, sebenarnya, opsi C tidak benar, tetapi saya tidak berpikir itu adalah jawaban yang diharapkan oleh penulis kuis, karena ada jawaban yang bahkan lebih salah.
Dalam contoh Anda,
functions
adalah array pointer ke fungsi dan bukan array fungsi itu sendiri. Demikian pula, lambdas dan functors juga tidak benar-benar berfungsi. Mereka adalah kelas yang merespons operator fungsi-panggilan, tetapi itu tidak membuat mereka berfungsi di mata definisi bahasa C ++.Fungsi dalam C ++ agak mirip warga negara kelas dua. Anda dapat mendefinisikan dan memanggil mereka, tetapi segera setelah Anda mencoba melakukan sesuatu yang lain dengan tipe fungsi (seperti membuat array dari mereka), Anda mendapatkan kesalahan atau mereka secara diam-diam mengubah diri mereka dalam sebuah pointer.
sumber
c
sebagai fungsi yang telah ditandai positif untuk inlining, versusinline
kata kunci itu sendiri. Saya mengertiinline
adalah sebuah petunjuk.Jika ada, itu harus b . Anda tidak bisa
return
seorangvoid
, tetapi Anda dapat mengembalikannull
. Void pada deklarasi fungsi harus ada di sana untuk memberi tahu kompilator tentang kurangnya nilai yang dikembalikan.Jenis Void
sumber
void
fungsi tidak mengembalikan nilai apa pun , mereka tetap mengembalikan jenisnyavoid
. Jadi saya katakan B benar.