[ magics @ 01.09.2006. 00:48 ] @
Da li neko zna kada je neophodno ispred imena konstruktora dodati prefix explicit? Znam ja da je to kad konstruktor ima ili moze da ima samo jedan argument pa kao da se ne bi mesao sa konstruktorom konverzije ali stos je sto u nekim primerima vidim da i sa jednim argumentom konstruktor nema prefix explicit.
[ karas @ 01.09.2006. 08:39 ] @
Kontruktor sa jednim parametrom implicitno definiše konverziju iz tipa parametra u tip klase. Npr. klasa

Code:

class C
{
  C(string&);
};


definiše konverziju iz klase string u klasu C. To znači da npr. funkcija

Code:

void f(C&);


koja prihvata argument tipa C ako se pozove sa npr.

Code:

string s = "Hello, World!";
f(s);


uradiće (implicitno) konverziju objekta s tipa string u objekat tipa C. Ako tako nešto treba onemogućiti, onda se kontruktor klase C definiše sa explicit. U tom slučaju, prethodno nije moguće, već se mora eksplicitno uraditi konverzija:

Code:

string s = "Hello, World!";
f(C(s));


[ toxi_programer @ 01.09.2006. 10:43 ] @
@Karas
Vrlo lepo receno.

Jos da dodam sledece. Ako imas konstruktor kopiranja a nemas operator dodele kompajler "ne pravi" sintetizovani konstruktor( kod njega se dodela vrednosti vrsi rekurzivno) nego koristi konstruktor kopiranja, medjutim ako hoces da onemogucis dodelu vrednosti stavi rec explicit kod definicije konstruktora.
Jos jedan primer. Uzmi klasu vector, ona ima konstruktor koji rezervise odredjenu kolicinu memorije ali je ne incializuje. Taj konstruktor MORA biti izricit(explicit) jer bi u suprotnom ti mogao da ga inicializujes ovako:
vector<int> broj = 100;
Izgleda kao da si mu dodao vrednost a u stvari si rezervisao memoriski prostor....
Cini mi se da sam negde procitao da explicit treba da bude onaj konstruktor koji ne menja vrednosti objekta, kao u primeru iznad.
[ karas @ 01.09.2006. 11:38 ] @
Prepisano iz C++ Primer.;)
[ magics @ 01.09.2006. 13:21 ] @
Hvala na brzom odgovoru od velike je pomoci. Ajde jos jedno pitanje i vise necu smarati. imam jedno pitanje sa ispita koje ne znam kako da resim :

Objasniti zašto navedena konstrukcija nije ispravna:
class A { int i; public: A(int ii){i=ii;} };
class B: public A { int j; public: B(int jj){j=jj;} };
[ karas @ 01.09.2006. 15:12 ] @
Code:

class A 

    int i; 
public: 
    A(int ii)
    {
        i=ii;
    }
};

class B: public A 
{
    int j; 
public:
    B(int jj) : A(jj)
    {
        j=jj;
    } 
};

int main()
{
}


je ispravno. Razlika je u B konstruktoru: poziva odgovarajucci A konstruktor. Ako se ne navede, kompajler poziva konstruktor A() koji nije definisan.

P.S.
Koristi code tagove.

[Ovu poruku je menjao karas dana 01.09.2006. u 16:41 GMT+1]
[ magics @ 01.09.2006. 16:57 ] @
Da kapiram sad mi je jasno. Hvala!
[ DjoleReject @ 02.09.2006. 02:56 ] @
magics, jel to neki od prethodnih ispita sa ETF-a i cuvena Tartaljina mini pitanja posle zadatka???
[ magics @ 02.09.2006. 15:17 ] @
bas tako pojavljivalo se ovo pitanje vec nekoliko puta.
[ DjoleReject @ 08.09.2006. 01:05 ] @
I kako si prosao?