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 ?
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 ?
Jawaban:
Jika Anda meletakkan deklarasi dalam file header, dan definisi dalam .cpp
file terpisah , dan #include
header dari .cpp
file yang berbeda , Anda akan dapat melihat perbedaannya.
Secara khusus, anggap:
int Add(int a, int b);
int Add(int a, int b = 3) {
...
}
#include "lib.h"
int main() {
Add(4);
}
Kompilasi test.cpp
tidak akan melihat deklarasi parameter default, dan akan gagal dengan kesalahan.
Untuk alasan ini, definisi parameter default biasanya ditentukan dalam deklarasi fungsi :
int Add(int a, int b = 3);
b
didefinisikan satu kali untuk setiap .cpp
file yang menyertakan header. Tapi tidak apa-apa, karena Anda hanya punya satu deklarasi Add
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
void foo(int a, int b);
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
void foo(int a, int b = 5);
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
void foo(int a = 1, int b);
dan mulai saat ini Anda dapat menyebutnya tanpa argumen eksplisit.
Contoh lengkapnya mungkin terlihat sebagai berikut
void foo(int a, int b);
int main()
{
foo(2, 3);
void foo(int a, int b = 5); // redeclare
foo(8); // OK, calls `foo(8, 5)`
void foo(int a = 1, int b); // redeclare again
foo(); // OK, calls `foo(1, 5)`
}
void foo(int a, int b)
{
// ...
}
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.
void foo(int a = 1, int b)
bekerja harus dinyatakan setelah void 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 menulis int 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.
b
akan didefinisikan beberapa kali, satu kali untuk setiap unit kompilasi yang termasuklib.h
, apakah itu benar?