Argumenty funkce typu odkazu
Často je efektivnější funkcím předávat reference namísto velkých objektů.To umožňuje kompilátoru předat adresu objektu při zachování syntaxe, která by byla použita k přístupu k objektu.Považte následující příklad používající strukturu Date:
// reference_type_function_arguments.cpp
struct Date
{
short DayOfWeek;
short Month;
short Day;
short Year;
};
// Create a Julian date of the form DDDYYYY
// from a Gregorian date.
long JulianFromGregorian( Date& GDate )
{
static int cDaysInMonth[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
long JDate = 0;
// Add in days for months already elapsed.
for ( int i = 0; i < GDate.Month - 1; ++i )
JDate += cDaysInMonth[i];
// Add in days for this month.
JDate += GDate.Day;
// Check for leap year.
if ( GDate.Year % 100 != 0 && GDate.Year % 4 == 0 )
JDate++;
// Add in year.
JDate *= 10000;
JDate += GDate.Year;
return JDate;
}
int main()
{
}
Předchozí kód ukazuje, že členy struktury předané referencí jsou zpřístupněny pomocí operátoru volby členu (.) namísto operátoru volby členu pro ukazatele (–>).
Ačkoli argumenty předané jako typy referencí používají syntaxi typů, které nejsou ukazateli, zachovávají důležitou vlastnost typů ukazatelů: lze je upravit, nejsou-li definovány pomocí modifikátoru const.Jelikož účelem předcházejícího kódu není upravit objekt GDate, je vhodnějším prototypem funkce tento prototyp:
long JulianFromGregorian( const Date& GDate );
Tento prototyp zaručuje, že funkce JulianFromGregorian nezmění svůj argument.
Jakákoli funkce, jejíž prototyp přijímá typ reference, může místo typu reference přijmout objekt stejného typu, protože existuje standardní převod z typu typename na typ typename**&**.