Share via


Verweistyp-Funktionsargumente

Häufig ist es effizienter, Verweise anstelle großer Objekte an Funktionen zu übergeben. Dies ermöglicht es dem Compiler, die Adresse des Objekts zu übergeben, während die Syntax beibehalten wird, die verwendet worden wäre, um auf das Objekt zuzugreifen. Betrachten Sie das folgende Beispiel, in dem die Date-Struktur verwendet wird:

// 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;
}

Der vorangehende Code zeigt, dass elemente einer struktur, die per Verweis übergeben wird, mithilfe des Memberauswahloperators (.) anstelle des Zeigerelementauswahloperators (->) aufgerufen werden.

Obwohl als Referenztypen übergebene Argumente die Syntax von Nicht-Zeigertypen beobachten, behalten sie ein wichtiges Merkmal von Zeigertypen bei: Sie sind modifizierbar, es sei denn, sie werden als constdeklariert. Da die Absicht des vorangehenden Codes nicht in der Änderung des date -Objekts liegt, ist ein geeigneterer Funktionsprototyp:

long DateOfYear( const Date& date );

Der Prototyp garantiert, dass die Funktion DateOfYear das Argument nicht ändert.

Jede Funktion, die als Bezugstyp erstellt wurde, kann ein Objekt desselben Typs an seiner Stelle akzeptieren, da es eine Standardkonvertierung von Typname in Typname&n gibt.

Siehe auch

Informationsquellen