Referencia helytelen/helyes használata

Döntsük el, van-e futási idejű hiba az alábbi programrészletekben!

 

a)

int & fv1(int v)

{

      return v;

}

 

b)

int fv2(int& rv)

{

      return rv;

}

 

c)

int& fv3()

{

      int lv=2;

      return lv;

}

 

d)

int fv3()

{

      int lv=2;

      return lv;

}

 

e)

int& fv2(int& rv)

{

      return rv;

}

f)

void fv (double & d)

{

      d+=1;

}

...

int a; 

fv(a);


g)

void fv (double & d)

{

      d+=1;

}

...

int a; 

fv((double&)a);



A megoldásért kattints ide!

A megoldáshoz arra az elvre van szükségünk, hogy lokális változó/érték szerint átvett argumentum címét nem szolgáltathatjuk ki a függvényen kívülre sem pointeren sem referencián keresztül. Ez a hiba futási időben jön elő, bár warningot kapunk. (SzC++Ny 2.4 fejezet).

 

a) A kódrészlet érték szerint átadott argumentumot ad vissza referencia szerint, ami súlyos futási idejű hiba (warningot ad a fordító).

 

b) A függvény nem referenciával/pointerrel tér vissza, így biztos nem szolgáltat ki semmilyen címet a függvényen kívülre, ez helyes.

 

c) A kódrészlet lokális változóra ad vissza referenciát, ezért hibás, futási idejű hiba (warningot ad a fordító).

 

d) A függvény nem referenciával/pointerrel tér vissza, így biztos nem szolgáltat ki semmilyen címet a függvényen kívülre, vagyis a kódrészlet referencia szempontjából helyes.

 

e) A referencia szerint átvett paraméter nem lokális, a függvény hívásának hatókörében is létezik, ezért erre akár referenciával/pointerrel is visszatérhetünk, ez referencia szempontjából helyes.

A további példák megoldásához szükséges elméleti ismereteket a félév vége felé fogjuk venni (v.ö. SzC++Ny 8.1).
f) int és double& között nincs automatikus konverzió, vagyis ez fordítási hiba.
g) Ha kierőszakoljuk  konverziót, akkor futási iedjű hibát idézünk elő, mert az int és a double& nem kompatibilis típusok.




2008.01.19. 22:16:04 |  Permalink  |  Hozzászólások száma: 2  |  Tárgyszavak: Nem OO elemek


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások


Dániel Dániel  (2016.02.15. 20:00:05)

g) A futási idejű hiba nem garantált. A nemdefiniált viselkedés garantált.

Dániel Dániel  (2016.02.15. 19:54:44)

f) Nem értek egyet az indoklással, nem az automatikus konverzió hiánya okozza a fordítási hibát, hanem éppen hogy az automatikus konverzió. Van automatikus konverzió int-ről double-ra, ezt numerikus előléptetésnek hívják. És ez a konverzió elég, referenciára nem kell konvertálni, mert a referencia paraméter átveheti a nem referencia argumentumot, tehát a double& d-nek át lehetne adni a double a-t. A hiba ott van, hogy a numerikus előléptetés során temporális, korrektebben fogalmazva rvalue objektum jön létre (tehát egy új double objektum), amit nem lehet átadni nemkonstans lvalue referenciaként. Ha a függvényszignatúrában a double elé const-ot írnánk, az átadás menne, és a hiba átkerülne a törzsbe, a d+=1; kifejezéshez. (d++; elegánsabb)