1.
int Add (int a, int b = 3);
int Add (int a, int b)
{
}
2.
int Add (int a, int b);
int Add (int a, int b = 3)
{
}
Keduanya bekerja; yang merupakan cara standar dan mengapa ?
c++
syntax
optional-parameters
httpinterpret
sumber
sumber
b
akan didefinisikan beberapa kali, satu kali untuk setiap unit kompilasi yang termasuklib.h
, apakah itu benar?b
didefinisikan satu kali untuk setiap.cpp
file yang menyertakan header. Tapi tidak apa-apa, karena Anda hanya punya satu deklarasiAdd
fungsi.Dalam C ++ persyaratan yang dikenakan pada argumen default sehubungan dengan lokasi mereka dalam daftar parameter adalah sebagai berikut:
Argumen default untuk parameter yang diberikan harus ditentukan tidak lebih dari sekali. Menentukannya lebih dari sekali (bahkan dengan nilai default yang sama) adalah ilegal.
Parameter dengan argumen default harus membentuk grup yang berdekatan di akhir daftar parameter.
Sekarang, dengan mengingat hal itu, dalam C ++ Anda diizinkan untuk "menumbuhkan" set parameter yang memiliki argumen default dari satu deklarasi fungsi ke yang berikutnya, selama persyaratan di atas terus terpenuhi.
Misalnya, Anda dapat mendeklarasikan fungsi tanpa argumen default
Untuk memanggil fungsi itu setelah deklarasi seperti itu, Anda harus menentukan kedua argumen secara eksplisit.
Kemudian (lebih jauh ke bawah) di unit terjemahan yang sama, Anda dapat mendeklarasikannya kembali, tetapi kali ini dengan satu argumen default
dan mulai saat ini Anda dapat menyebutnya hanya dengan satu argumen eksplisit.
Lebih jauh ke bawah Anda dapat mendeklarasikannya lagi menambahkan satu argumen default lagi
dan mulai saat ini Anda dapat menyebutnya tanpa argumen eksplisit.
Contoh lengkapnya mungkin terlihat sebagai berikut
Adapun kode dalam pertanyaan Anda, kedua varian benar-benar valid, tetapi keduanya memiliki arti berbeda. Varian pertama mendeklarasikan argumen default untuk parameter kedua segera. Varian kedua awalnya menyatakan fungsi Anda tanpa argumen default dan kemudian menambahkan satu untuk parameter kedua.
Efek bersih dari kedua deklarasi Anda (yaitu cara dilihat oleh kode yang mengikuti deklarasi kedua) persis sama: fungsi memiliki argumen default untuk parameter kedua. Namun, jika Anda berhasil memeras beberapa kode antara deklarasi pertama dan kedua, kedua varian ini akan berperilaku berbeda. Pada varian kedua fungsi tidak memiliki argumen default antara deklarasi, jadi Anda harus menentukan kedua argumen secara eksplisit.
sumber
void foo(int a = 1, int b)
bekerja harus dinyatakan setelahvoid foo(int a, int b = 5)
. Ya, itu akan berhasil. Dan tidak, ini bukan kesalahan sintaksis. g ++ 4.5.3 akan mengkompilasinya dengan sangat baik.int foo(int)
. Saya menemukan bahwa saya dapat menulisint foo(int=5)
lagi, meninggalkan nama parameter. Sepertinya belum ada yang menyebutkan hal itu.Cara pertama lebih disukai daripada yang kedua.
Ini karena file header akan menunjukkan bahwa parameternya opsional dan berapa nilai defaultnya. Selain itu, ini akan memastikan bahwa nilai default akan sama, tidak peduli penerapan file .cpp yang sesuai.
Dengan cara kedua, tidak ada jaminan nilai default untuk parameter kedua. Nilai default dapat berubah, tergantung pada bagaimana file .cpp yang sesuai diimplementasikan.
sumber
Argumen default harus ditentukan dengan kemunculan pertama nama fungsi — biasanya, dalam prototipe fungsi. Jika prototipe fungsi dihilangkan karena definisi fungsi juga berfungsi sebagai prototipe, maka argumen default harus ditentukan dalam header fungsi.
sumber