explicit og implicit

Tags:    c++

Hej!

Henrik Tange som er forfatteren til en c++ bog
skriver at når man f.eks har en klasse Auto
som har en constructor med en parametre
hvis så man skriver:

Auto bil = 10;
så skriver Henrik Tange at constructoren
benyttes implicit. Han skriver dog ikke hvorfor. Og hvis man gør det på følgende måde:

Auto bil(10)
så benyttes construtoren explicit. Heller ikke
her får man en forklaring hvorfor.
Så skriver han at man kan bruge explicit
nøgleordet på constructoren så man ikke
kan bruge den implicit. Hvordor skal man ikke
kunne bruge den implicit? håber
der er nogen der kan give en lidt bedre forklaring på de her emner jeg har fortalt om.

Tak!



Indlæg senest redigeret d. 09.05.2010 13:58 af Bruger #15732
4 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hvis du bruger
Auto bil = 10;
Vil kompileren køre kontructoren til at konstruere bil, du har ikke direkte kaldt constructoren, så man siger at det sker implicit. (Noget tilsvarende kan ske med casts.)

Hvis du laver en containter class til at holde f.eks. integers, vil du måske synes at det er logisk at lave en constructor hvor den initielle størrelse kan angives i constructoren:
Container myCollection(10);

Men det er ikke logisk at oprette en container med initiel størrelse på 10 på denne måde:
Containter myCollection = 10;
Bl.a. fordi nogen ville læse det som om containeren havde ét element med værdien 10.
I dette tilfælde ville man nok vælge at lave denne constructor explicit.



Tak for hjælpen Bertel! :)

Men hvad mener du med at du ikke direkte
har kaldt konstruktøren?



Indlæg senest redigeret d. 09.05.2010 17:25 af Bruger #15732
Her kalder man konstructoren direkte:
Auto bil(10)

Her gør man det ikke:
Auto bil = 10;

Et andet tilfælde:
class X { X(int); }
void func(const X x);
func(10);
func(X(10));

I den første linie kalder man ikke konstructoren direkte, det gør man i det anden. I anden linie bliver constructoren kaldt implicit.



Ok tak for hjælpen Bertel :)



t