OOP 07 lek funkció túlterhelés

Funkció túlterhelés ________________________________________________________________ 1

Cél túlterhelés __________________________________________________________________ 1 fordító díszítő funkciót nevek ________________________________________________ 2 túlterhelés funkciók _____________________________________________________________________ 2 túlterhelés konstruktőrök ________________________________________________________________ 3 Ambiguity túlterhelés _____________________________________________________________ 3

Funkció túlterhelés - az egyik típusú polimorfizmus által nyújtott C ++. A C ++, több funkciót lehet ugyanaz a neve. Ebben az esetben a függvény által meghatározott azonos nevű, úgynevezett túlterhelt. Indítsa újra a csak a jellemzők, amelyek eltérnek, vagy a típus vagy több érveiket. Túlterhelés funkciók, amelyek egymástól csak visszatérési típusa,

ez lehetetlen. Túlterhelt funkciók lehetővé teszik, hogy egyszerűsítse a program lehetővé teszi a kezelést, hogy egyetlen név a végrehajtására hasonló jelentésű akció.

Túlterhelni egy funkciót, akkor csak meg kell, hogy állapítsa meg, majd meghatározza az összes szükséges lehetőségeket nyújt a hívást. A fordítóprogram automatikusan kiválasztja a megfelelő verzióját a hívás alapján számát és típusát érveket. például:

// prototípusok túlterhelt függvények

// függvény megkapja, és visszatér egy egész

float abs (float);

// funkció működik egy egyszeres pontosságú lebegőpontos szám

kettős abs (dupla);

// funkció működik a valós számának kétszeres pontosságú

lebegnek mF. F = -25.0f; kettős mD. D = -2,55;

// hívja a túlterhelt függvény abs (int)

// hívja a túlterhelt függvény abs (float)

// hívja a túlterhelt függvény abs (dupla)

cout <<'|' <

float abs (float a)

cout<<"abs(float)\t"; return a <0. –a. a ;

kettős abs (dupla a)

cout<<"abs(double)\t"; return a <0. –a. a ;

Amikor a program megjeleníti:

MENT. Így, ebben a példában, azt elvégzik túlterhelés abs () függvény. így könnyebb programozni. Attól függően, hogy a neki átadott a kívánt opciót az úgynevezett funkciót.

Ez a példa azt mutatja, hogyan kell használni a túlterhelés egyszerűsítheti a kódot, amely lehetővé teszi, hogy a programozó használni a funkciót, az érveket, amelyek a különböző típusú továbbítják. Természetesen a lehetőségét, hogy a torlódás magas követelményeket támaszt a fordító.

Díszítő fordító funkció nevek

Koncepció megvalósítása túlterhelés, a fejlesztők a C ++ fordító kellett bevezetni díszítő neveket. Ez azt jelenti, hogy az összes funkciót a programkód által termelt fordító nevek alapján a neve, a programozó, és a szám, és az érveket. Különböző fordítóprogramok hogy némileg eltér egymástól módon. Itt leírjuk, akárcsak a cég Inprise fordító (korábban - Borland cég).

Eleinte ott a „@” szimbólum és az osztály nevét, majd a „@” szimbólum, és a nevét a funkció az összes olyan azonosítót a kis- és nagybetűket. Ezt követi egy karaktersorozat „@q”, amelyből a kódolt jelölése funkció paramétereit. Utalni utalásokkal és utalásokat a kódokat a beépített típusok adunk a betűk „p” és „r”, ill. Például ha adott egy osztály definíció:

érvényteleníti SetVal (void); érvényteleníti SetVal (int);

void SetVal (int * dupla.); void SetVal (int . int. float);

Borland C ++ fordító generál olyan nevek funkciók:

Ez azt jelzi, hogy a visszatérési érték nem vesz részt a díszítő neveket. Ez az oka nem lehet túlterhelni funkciókat, amelyek egymástól csak visszatérő típus. Foglalkozni hogyan díszítik a nevét az adott fordító elég könnyű. Elég, ha szükség rá, hogy adjon ki egy azonos assembler program szövege.

int func (int); int func (int );

Ez vezet a hiba, mivel szempontjából torlódások tekintik őket egyenlő.

Érvei kapcsolatos funkciók bizonyos típusú módosított const vagy illékony. Ez nem kezelik különbözik az alaptípus szempontjából túlterhelés.

Mutatók const - illékony és -objects szintén nem tekinthető elkülönült mutatókat az alap típus szempontjából túlterhelés.

Azonban a túlterhelés mechanizmus tudja különböztetni linkek, amelyek módosítók const és változékony. és hivatkozásokat a alaptípus.

Azonban a túlterhelt függvények átfedés számos korlátja: bármely két túlterhelt függvények kell a különböző listák paraméterek;

túlterhelés függvények azonos argumentumlistát alapuló típus a visszaadott érték érvénytelen;

Tag funkciók nem túlterhelt alapulhat kizárólag az a tény, hogy egyikük statikus, és a többi - nem;

enum -types összes adatot kezelnek különböző, és lehet, hogy megkülönböztesse a túlterhelt függvények;

típusú „array (valami)” és a „pointer (valami)” tekinthető azonosnak tekintve túlterhelés.

typedef -FIND nem érinti a túlterhelés mechanizmus, mivel azok nem vezetnek be új típusú adatok, és meghatározzák, csak szinonimái a meglévő típusok.

Például ez a meghatározás typedef char * PSTR;

nem teszi lehetővé, hogy a fordító figyelembe venni a következő két funkciót

érvényteleníti SetVal (char * sz); void SetVal (PSTR sz);

A többdimenziós tömbök, a második és az azt követő dimenziók részének tekintjük az adatok típusát. Ezért fel lehet használni, hogy különbséget túlterhelt függvények. Például, akkor a következő meghatározásokat:

érvényteleníti SetVal (char S []); érvényteleníti SetVal (char S [] [4]);

Leggyakrabban létrehozásához használt túlterhelés túlterhelt konstruktőrök (túlterhelés destructor nem lehet!). E túlterhelés a vágy, hogy a felhasználó a lehető legnagyobb mértékben létrehozásának lehetőségeit az osztály tagjai. Tény, hogy már számos alkalommal találkoztak a túlterhelés konstruktőrök, bár nem beszéltünk róla. Ha az osztály biztosítja a kivitelező paraméterekkel, és az alapértelmezett konstruktor van dolgunk túlterhelés tervezők. Mint már tudjuk, az alapértelmezett konstruktor szükséges memória dinamikus tömb tárgyak (dinamikus tömb objektum nem inicializált).

Egy másik eset az, amikor szükség van, hogy túlterhelés konstruktőrök - a vágy, hogy a felhasználó a tervezők átalakítás típusát.

Találtunk egy pontos egyezés; tartja a triviális átalakulás;

konverziós integer típusú; létezik egy szabványos konverziós a kívánt típusú az érvelés;

van egy programozó-definiált transzformáció (a transzformációs operátort vagy a tervező) a kívánt típusú az érvelés;

az érvek, amelyekkel a pontok talált.

A fordító generál egy sor jelölt funkciók megfelelés minden érv. Ezután az egyes paraméterek épül meg a megfelelő funkciókat a lehető legjobb módon. Nako-

Heff definiált függvény, amely a legjobban illik a hívást a metszéspontja ezeket a csomagokat. Ha ez a kereszteződés már tartalmaz néhány funkciót - túlterhelés kétértelmű, és a fordító hibaüzenetet generál.

Egy másik fontos megfigyelés. Kétértelműség túlterhelt függvények nem lehet meghatározni, amíg függvényhívás.

Funkció n érvek alapértelmezés, a szempontból a megfelelő érvek, tekinteni, mint egy kombinációs n + 1 funkciók, amelyek mindegyike eltér az előző egy további feladatot érv. (.) Képpont viselkedik, mint tetszőleges karakter: ez megfelel az adott érv. Ez lehet egy forrás kétértelműséget a kiválasztás egy túlterhelt függvény.

Az összes fenti alkalmazni minden túlterhelt függvények, tekintet nélkül arra, hogy azok tagsági függvények, vagy sem. Nézzük a pontos túlterhelt tag funkciókat.

Osztály tagja funkciók tartják, aszerint azok statikus vagy nem adják meg, mert nem statikus függvény implicit érv, amely fogadja a mutató ezt. Annak megállapítására, a funkció, amely a legjobban illik a felhívás nem statikus tagfüggvény tartják csak azok túlterhelt tagfüggvény, amelyek rejtett ez a mutató megfelel az objektum típusát, hogy jut el a hívott függvénynek. Eltérően más érveket, amikor megpróbál létrehozni megfelel ennek a mutatót érv, nincs átalakítást végeztek.

Constructor deklarált a tervező explicit. nem vesz részt az implicit típusú átalakítás. Ez csak akkor használható, abban az esetben, ha nem az átalakítás típusát érv van szükség. Például egy osztály fenti:

Kapcsolódó cikkek