省略符號和預設引數
如需傳遞可變引數數目的詳細資訊只要使用下列兩種方法的其中一種,函式就可以宣告為接受比函式定義中所指定數目少的引數:省略符號 (...) 或預設引數。
省略符號表示可能需要引數,但是宣告中未指定數目和類型。 一般來說,這並不是理想的 C++ 程式設計做法,因為它會失去其中一項 C++ 的優點:類型安全。 以省略符號宣告的函式適用的轉換方式,與已知正式和實質引數類型的函式所適用的轉換方式不同:
如果實質引數為 float 類型,則會在函式呼叫之前提升為 double 類型。
任何帶正負號或不帶正負號的 char、short、列舉類型或位元欄位,都會使用整數提升轉換成帶正負號或不帶正負號的 int。
任何類別類型的引數都會以傳值的方式做為資料結構傳遞,而複本會以二進位檔複製的方式建立,而不會以叫用類別之複製建構函式 (如果有的話) 的方式建立。
若使用省略符號,則必須是引數清單中最後宣告的項目。 如需傳遞可變引數數目的詳細資訊,請參閱《執行階段程式庫參考》中有關 va_arg、va_start 和 va_list 的討論。
如需 CLR 程式設計中預設引數的詳細資訊,請參閱 變數引數清單 (...) (C++/CLI)。
預設引數可讓您指定函式呼叫中未提供值時,引數應該假設的值。 下列程式碼片段將示範預設引數的運作方式。 如需指定預設引數之限制的詳細資訊,請參閱預設引數。
// expre_Ellipses_and_Default_Arguments.cpp
// compile with: /EHsc
#include <iostream>
// Declare the function print that prints a string,
// then a terminator.
void print( const char *string,
const char *terminator = "\n" );
int main()
{
print( "hello," );
print( "world!" );
print( "good morning", ", " );
print( "sunshine." );
}
using namespace std;
// Define print.
void print( const char *string, const char *terminator )
{
if( string != NULL )
cout << string;
if( terminator != NULL )
cout << terminator;
}
上述程式會宣告接受兩個引數的函式 print。 不過,第二個引數 terminator 的預設值為 "\n"。 在 main 中,前兩個對 print 的呼叫允許預設的第二個引數提供新行字元以終止列印的字串。 第三個呼叫會為第二個引數指定明確的值。 程式的輸出為
hello,
world!
good morning, sunshine.