Argumenty funkcji typu odwołania
Często bardziej wydajne jest przekazywanie odwołań, a nie dużych obiektów do funkcji. Dzięki temu kompilator może przekazać adres obiektu przy zachowaniu składni, która byłaby używana do uzyskiwania dostępu do obiektu. Rozważmy następujący przykład, który używa Date
struktury:
// 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;
}
Powyższy kod pokazuje, że elementy członkowskie struktury przekazanej przez odwołanie są dostępne przy użyciu operatora wyboru elementu członkowskiego (.) zamiast operatora wyboru elementu członkowskiego wskaźnika (->).
Mimo że argumenty przekazywane jako typy referencyjne obserwują składnię typów innych niż wskaźnik, zachowują jedną ważną cechę typów wskaźników: są modyfikowalne, chyba że zadeklarowane jako const
. Ponieważ celem poprzedniego kodu nie jest zmodyfikowanie obiektu date
, bardziej odpowiedni prototyp funkcji to:
long DateOfYear( const Date& date );
Ten prototyp gwarantuje, że funkcja DateOfYear
nie zmieni argumentu.
Każda funkcja prototypowana jako typ odwołania może akceptować obiekt tego samego typu, ponieważ istnieje standardowa konwersja z nazwy typu na typname&.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla