Bagikan melalui


Argumen Default

Dalam banyak kasus, fungsi memiliki argumen yang jarang digunakan sehingga nilai default sudah cukup. Untuk mengatasi hal ini, fasilitas argumen default memungkinkan untuk menentukan hanya argumen tersebut ke fungsi yang bermakna dalam panggilan tertentu. Untuk mengilustrasikan konsep ini, pertimbangkan contoh yang disajikan dalam Function Overloading.

// Prototype three print functions.
int print( char *s );                  // Print a string.
int print( double dvalue );            // Print a double.
int print( double dvalue, int prec );  // Print a double with a
//  given precision.

Dalam banyak aplikasi, default yang wajar dapat disediakan untuk prec, menghilangkan kebutuhan akan dua fungsi:

// Prototype two print functions.
int print( char *s );                    // Print a string.
int print( double dvalue, int prec=2 );  // Print a double with a
//  given precision.

Implementasi print fungsi diubah sedikit untuk mencerminkan fakta bahwa hanya satu fungsi tersebut yang ada untuk jenis double:

// default_arguments.cpp
// compile with: /EHsc /c

// Print a double in specified precision.
//  Positive numbers for precision indicate how many digits
//  precision after the decimal point to show. Negative
//  numbers for precision indicate where to round the number
//  to the left of the decimal point.

#include <iostream>
#include <math.h>
using namespace std;

int print( double dvalue, int prec ) {
   // Use table-lookup for rounding/truncation.
   static const double rgPow10[] = {
      10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,
         10E1,  10E2,  10E3,  10E4, 10E5,  10E6
   };
   const int iPowZero = 6;
   // If precision out of range, just print the number.
   if( prec >= -6 && prec <= 7 )
      // Scale, truncate, then rescale.
      dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *
      rgPow10[iPowZero - prec];
   cout << dvalue << endl;
   return cout.good();
}

Untuk memanggil fungsi baru print , gunakan kode seperti berikut:

print( d );    // Precision of 2 supplied by default argument.
print( d, 0 ); // Override default argument to achieve other
//  results.

Perhatikan poin-poin ini saat menggunakan argumen default:

  • Argumen default hanya digunakan dalam panggilan fungsi di mana argumen berikutnya dihilangkan — argumen tersebut harus menjadi argumen terakhir. Oleh karena itu, kode berikut ilegal:

    int print( double dvalue = 0.0, int prec );
    
  • Argumen default tidak dapat ditentukan ulang dalam deklarasi selanjutnya meskipun pendefinisian ulang identik dengan aslinya. Oleh karena itu, kode berikut menghasilkan kesalahan:

    // Prototype for print function.
    int print( double dvalue, int prec = 2 );
    
    ...
    
    // Definition for print function.
    int print( double dvalue, int prec = 2 )
    {
    ...
    }
    

    Masalah dengan kode ini adalah bahwa deklarasi fungsi dalam definisi mendefinisikan ulang argumen default untuk prec.

  • Argumen default tambahan dapat ditambahkan dengan deklarasi selanjutnya.

  • Argumen default dapat disediakan untuk penunjuk ke fungsi. Contohnya:

    int (*pShowIntVal)( int i = 0 );