Forskjellen mellom variabel-lengde argument og funksjon overbelastning

stemmer
3

Denne C ++ spørsmålet synes å være ganske grunnleggende og generelt, men fortsatt jeg vil at noen skal svare.

1) Det er forskjellen mellom en funksjon med variabel lengde argument og en overbelastet funksjon? 2) Vil vi få problemer hvis vi har en funksjon med variabel lengde argument og en annen med samme navn funksjon med lignende argumenter?

Publisert på 14/10/2009 klokken 14:57
kilden bruker
På andre språk...                            


4 svar

stemmer
1

1) Vel en overbelastet funksjon vil kreve en helvetes mange forskjellige prototyper og implementeringer. Det vil også være type trygg.
2) Ja dette vil føre til at du problemer som kompilatoren ikke vet hvilken funksjon det er behov for å ringe. Det kan eller kan ikke varsle om dette. Hvis den ikke gjør det kan du godt ende opp med vanskelig å finne feil.

Svarte 14/10/2009 kl. 15:00
kilden bruker

stemmer
7

2) Mener du følgende?

int mul(int a, int b);
int mul(int n, ...);

La oss anta at de første multipliserer 2 heltall. Den andre multipliserer nhele tall vedtatt av VAR-args. Kalt med f(1, 2)vil ikke være tvetydig, fordi et argument gått gjennom "ellipse" er assosiert med høyest mulig pris. Passerer et argument for en parameter av samme type er imidlertid forbundet med lavest mulig kostnad. Så dette veldig samtalen vil sikkert bli løst til den første funksjonen :)


Legg merke til at overbelastning oppløsning bare sammen argument for å parameterkonverter for den samme posisjon. Det vil mislykkes vanskelig hvis en funksjon for noen parameter paret har en vinner. For eksempel

int mul(int a, int b);
int mul(double a, ...);

Tenk deg de første multipliserer to tall, og den andre multipliserer en liste over dobler som avsluttes med en 0.0. Dette overbelastning sett er feil og vil være tvetydig når kalt av

mul(3.14, 0.0); 

Dette er fordi den andre funksjonen vinner for det første argumentet, men den første funksjon vinner for det andre argumentet. Det spiller ingen rolle at omdannelsen kostnadene for den andre argumentet er høyere for den annen funksjon enn kostnaden for den første argumentet for den første funksjon. Når en slik "cross" vinner situasjonen er bestemt, er samtalen for slike to kandidater tvetydig.

Svarte 14/10/2009 kl. 15:05
kilden bruker

stemmer
0

Det er ganske generell, og Goz har allerede dekket noen av punktene. Noen få til:

1) En variabel argument liste gir udefinert oppførsel hvis du passerer noe, men POD stedene. Belastet funksjoner kan motta noen form for gjenstander.

2) Du kan ha tvetydighet hvis ett medlem av en overbelastning sett tar en variabel argument liste. Så igjen, kan du ha tvetydighet uten det også. Den variable argumentlisten kan skape uklarhet i et større antall situasjoner skjønt.

Det første punktet er det virkelig alvorlig - for de fleste praktiske formål, det gjør variable argumentlister rent et "legacy" element i C ++, ikke noe å selv vurdere å bruke i en ny kode. Den vanligste alternativ er kjeding belastet operatorer i stedet (for eksempel iostream innførerne / ekstraktorer versus printf / scanf).

Svarte 14/10/2009 kl. 15:13
kilden bruker

stemmer
1

En overbelastet funksjon kan ha helt forskjellige parametertyper, inkludert ingen, med den riktige blir plukket avhengig av parametertyper.

En variabel-lengde argument krever i det minste én parameter for å være til stede. Du trenger også noen mekanisme for å "forutsi" type neste parameter (som du må oppgi den i va_arg()), og det må være en grunnleggende type (dvs. heltall, flyttall eller pekeren). Vanlige teknikker her er "formatstrenger" (som i printf(), scanf()), eller "tag lister" (hver odde element i parameterlisten være en enum fortelle hvilken type følgende enda element, med en null enum å markere slutten på parameteren liste).

Generelt sett er overbelastning C ++ veien å gå. Hvis du ender opp virkelig trenger noe beslektet med variabel lengde argument lister i C ++, for eksempel for beleilig kjeding argumenter av ulike antall og type, vurdere hvordan C ++ bekker arbeid (de sammensatte "<<" og ">>" s):

class MyClass {
    public:
        MyClass & operator<<( int i )
        {
            // do something with integer
            return *this;
        }

        MyClass & operator<<( double d )
        {
            // do something with float
            return *this;
        }
};

int main()
{
    MyClass foo;
    foo << 42 << 3.14 << 0.1234 << 23;
    return 0;
}
Svarte 14/10/2009 kl. 15:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more