Reference-Type Function Arguments (参照型関数の引数)
多くの場合、大きなオブジェクトよりも、関数への参照を渡す方が効率的です。 これにより、コンパイラは、オブジェクトへのアクセスに使用される構文を保持しつつ、オブジェクトのアドレスを渡すことができます。 Date
構造体を使用する次の例について考えます。
// reference_type_function_arguments.cpp
#include <iostream>
struct Date
{
short Month;
short Day;
short Year;
};
// Create a date of the form DDDYYYY (day of year, year)
// from a Date.
long DateOfYear( Date& date )
{
static int cDaysInMonth[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
long dateOfYear = 0;
// Add in days for months already elapsed.
for ( int i = 0; i < date.Month - 1; ++i )
dateOfYear += cDaysInMonth[i];
// Add in days for this month.
dateOfYear += date.Day;
// Check for leap year.
if ( date.Month > 2 &&
(( date.Year % 100 != 0 || date.Year % 400 == 0 ) &&
date.Year % 4 == 0 ))
dateOfYear++;
// Add in year.
dateOfYear *= 10000;
dateOfYear += date.Year;
return dateOfYear;
}
int main()
{
Date date{ 8, 27, 2018 };
long dateOfYear = DateOfYear(date);
std::cout << dateOfYear << std::endl;
}
上記のコードは、参照によって渡される構造体のメンバーが、ポインターメンバー選択演算子 (->) ではなくメンバー選択演算子 (.) を使用してアクセスされることを示しています。
参照型として渡された引数はポインター型以外の型の構文に従いますが、const
として宣言されない限り変更できるという、ポインター型の 1 つの重要な特性を保持します。 前のコードの意図は date
オブジェクトを変更することではないため、より適切な関数プロトタイプは次のとおりです。
long DateOfYear( const Date& date );
このプロトタイプによって、関数 DateOfYear
が引数を変更しないことが保証されます。
参照型を受け取るようにプロトタイプ化された関数は、typename から typename への標準変換があるため、その代わりに同じ型のオブジェクトを受け取ることができます。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示