Аргументы функции ссылочного типа
Вместо крупных объектов эффективнее бывает передавать функциям ссылки. Это позволяет компилятору передавать адрес объекта, сохраняя при этом синтаксис, который использовался бы для обращения к этому объекту. Рассмотрим следующий пример, в котором используется структура 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
. Поскольку задача приведенного выше кода заключается не в том, чтобы изменить объект date
, более подходящим будет следующий прототип функции:
long DateOfYear( const Date& date );
Этот прототип гарантирует, что функция DateOfYear
не изменит его аргумент.
Любая функция, прототипная как принимающие ссылочный тип, может принимать объект того же типа в своем месте, так как существует стандартное преобразование из имени типав typename&>.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по