C++ értelmezési sorrend

C++ értelmezési sorrend
2013-10-17T15:21:53+02:00
2013-10-19T06:49:50+02:00
2022-08-08T07:20:30+02:00
WarmUp
Sziasztok!

Hol találhatok leírást azzal kapcsolatban, hogy a C++ milyen sorrendben próbálja értelmezni a kódomat?

Olyanokra gondolok, mint függvényhívás:
1. Ha van olyan argumentumlistájú függvény, akkor azt
2. Ha nincs, de castolhatóak létező listájúra, akkor azt

vagy operator = értelmezése:
class a { int data; }; class b { float data; }; a xa; b xb; xa = xb; ???
1. a.operator=() hívása, ha van
2. (a)b, b castolása a-ra, ha megoldható
3. a(b), a megfelelő konstruktorának a hívása, ha van

Előre is köszönöm.
Mutasd a teljes hozzászólást!
Mindig azt a függvényt választja, amely a legjobban megfelel az adott signature-nek.

Jelen esetben:
a = b;

ha létezik a
A::opretor=(const B&)
akkor azt választja, hiszen ez felel meg a legjobban.

Ha nem létezik olyan signature, amire szükség van, de implicit cast-olható olyan típusra (1 lépésben!), amely signature már létezik, akkor azt választja. (Ha többre is, akkor fordító hibát jelez, hogy nem egyértelmű, hogy melyiket használja). Ilyenkor static_cast-al megmondhatod, hogy mivé szeretnéd alakítani és azt fogja használni.

Tehát ha nem létezik a fentebb leírt operator=, de léteznek az alábbiak:
A::operator=(const A&) és A::A(const B&)
Akkor ezeket hívja.

implicit conv. rules
static_cast rules

Még mindig nem értem, miért nem próbálod ki őket..
Pár sor gépelés az egész!
Mutasd a teljes hozzászólást!

  • A válasz egyértelmű, ha végig gondolod!

    most sajnos nincs időm leírni. De gondold csak végig az esteket (milyen konstruktor, operator-ok vannak megvalósítva..).
    És írd le, ha valamelyikkel konkrétan problémád van.

    Miért nem implementálod és nézed meg, hogy melyik hívódik meg?
    Mutasd a teljes hozzászólást!
  • Amikor még C-ben programoztam, akkor volt egy fénymásolt lapom a K&R könyvből az operátorok precedenciájáról. A másik oldalon meg talán az értékadások lehetséges módjai voltak meg a format karakterek a printf, scanf függvényekhez. Volt, hogy szükség volt rá, de majdnem minden kérdésre ott volt a válasz ezen az egy lapon.
    A C++ ehhez képest behozott egy csomó új dolgot, default constructor, virtual, polimorfizmus, operátor overloading, mindenféle castolások, explicit, final, ...
    Ezek után felmerült a kérdés, hogy hol találom ennek az értelmezési sorrendjét.
    Most tehát azt az 'A4-es weblapot' keresem, ami ugyanazt tudja a C++-hoz, amit az a régi papirosom a C-hez.
    Mutasd a teljes hozzászólást!
  • Nem igazán értem, hogy pontosan mit is szeretnél.

    reference

    A linken szerintem majdnem mindent megtalálsz, ami kellhet neked.
    Max kinyomtatod, amire igényt tartasz :D

    Ott van az
    Operator precedence, keywords, fundamental types, escape sequences, stb..
    Mutasd a teljes hozzászólást!
  • Köszönöm a linket.

    Az operator precedence megvan.

    Viszont például az
    a = b
    értelmezésénél ( ha a és b is class példány) én erre lennék kíváncsi:
    1. a.operator=() hívása, ha van
    2. (a)b, b castolása a-ra, ha megoldható
    3. a(b), a megfelelő konstruktorának a hívása, ha van
    4. Lehet, hogy még más lehetőségek is lennének, csak nem tudok róla.

    De ilyen jellegű információt egyszerűen nem találok
    és nem tudom melyik részen keressem.

    Köszönettel:
    János
    Mutasd a teljes hozzászólást!
  • Én megnéztem Visual Studioban, elsőként nekem az operator = miatt zokogott, majd konstruktorért nyefegett....

    Ha létrehoztam mindkettőt akkor az operátor függvényt hívta meg.

    Ha nincs operátor függvény, de van megfeleő konstruktor, akkor azt hívta meg.

    A sorrend tehát operator= majd konstrukor függvény.

    Végül mindakettő egy speciális member függvény, így nyilván az lesz az első amelyik jobban közelíti a programozó elvárásait.

    Visszont a catolást nem egészen értem, ha csak azt is nem lehet overridolni, ha lehet valószínű az lesz a következő, amit meghív.
    Mutasd a teljes hozzászólást!
  • Mindig azt a függvényt választja, amely a legjobban megfelel az adott signature-nek.

    Jelen esetben:
    a = b;

    ha létezik a
    A::opretor=(const B&)
    akkor azt választja, hiszen ez felel meg a legjobban.

    Ha nem létezik olyan signature, amire szükség van, de implicit cast-olható olyan típusra (1 lépésben!), amely signature már létezik, akkor azt választja. (Ha többre is, akkor fordító hibát jelez, hogy nem egyértelmű, hogy melyiket használja). Ilyenkor static_cast-al megmondhatod, hogy mivé szeretnéd alakítani és azt fogja használni.

    Tehát ha nem létezik a fentebb leírt operator=, de léteznek az alábbiak:
    A::operator=(const A&) és A::A(const B&)
    Akkor ezeket hívja.

    implicit conv. rules
    static_cast rules

    Még mindig nem értem, miért nem próbálod ki őket..
    Pár sor gépelés az egész!
    Mutasd a teljes hozzászólást!
  • Más a helyzet, ha ezt írod:

    A a = b;
    Ilyenkor kapásból a constructor hívódik meg, hiszen itt konstruálod meg az 'a' objektumod.

    Míg az
    a = b;
    esetben az 'a' objektm már létezik, így a megfelelő assignment operator-t keresi! Egy objektumra csak 1xer fut le a megfelelő constructor!
    Mutasd a teljes hozzászólást!
  • Kipróbáltam újra és rájöttem, hogy én a fordító javaslataiként láttam ezt a bizonyos feloldási sorrendet.

    class aClass { public: int data; }; class bClass { public: float data; // bClass(): data(0) {}; // bClass(aClass other) : data(other.data) {}; }; int main(){ aClass a; bClass b; b = a; return b.data; }
    Erre ugyanis a következőhibát kapom

    d:\c++\tmp\g++.exe -Wall -o order order.c order.c: In function 'int main()': order.c:19:7: error: no match for 'operator=' in 'b = a' order.c:19:7: note: candidate is: order.c:6:7: note: bClass& bClass::operator=(const bClass&) order.c:6:7: note: no known conversion for argument 1 from 'aClass' to 'const bClass&'

    Viszont ez nem tartalmazza például a következő feloldási lehetőségeket

    class bClass; class aClass { public: int data; operator bClass(); }; class bClass { public: float data; }; aClass::operator bClass() { return bClass(); } int main(){ aClass a; bClass b; b = a; return b.data; }

    vagy ezt a másikat

    class aClass { public: int data; }; class bClass { public: float data; bClass(): data(0) {}; bClass(aClass other) : data(other.data) {}; }; int main(){ aClass a; bClass b; b = a; return b.data; }
    Mutasd a teljes hozzászólást!
abcd