Implicitním konstruktorem se v C++ myslí konstruktor, který lze použít automaticky ke konverzi. Tzn. je jednoparametrický a parametrem je nějaký jiný typ. V tomto případě tedy int. V zadané situaci se použije v obou případech, rozdíl je v tom, že v první situaci musí existovat, ale může být i explicitní a použije ho překladač stejně, ve druhém případě musí buď existovat operator=(int) nebo tento implicitni konstruktor a operator=(const Object&), ten si ale překladač umí vygenerovat. Kdyby parametrem navíc nebyl int, ale nějaká třída, tak by ještě úlohu mohly sehrát přetypovací operátory.
Ten popis je tak nesrozumitelnej, že bych radši doporučil si zkusit pohrát s následujícím příkladem -- odkomentovat/zakomentovat slovo explicit, odkomentovat/zakomentovat řádek začínající // a zkusit pochopit, co to dělá
[code][color=green]#include[/color]
[color=green]#include[/color]
[bold]using[/bold] [bold]namespace[/bold] std;
[bold]class[/bold] Trida1 {
[bold]public[/bold]:
Trida1() { cout << [color=red]"Bezparametricky konstruktor"[/color] << endl; }
[color=blue]/*[bold]explicit[/bold]*/[/color] Trida1([bold]int[/bold] x) { cout << [color=red]"Konstuktor s parametrem "[/color] << x << endl; }
[color=blue]// Trida1& [bold]operator[/bold]=([bold]int[/bold] x) { cout << "Prirazovaci [bold]operator[/bold] " << x << endl; [bold]return[/bold] *[bold]this[/bold]; }[/color]
Trida1& [bold]operator[/bold]=([bold]const[/bold] Trida1&) { cout << [color=red]"Prirazovaci [bold]operator[/bold] [bold]const[/bold] Trida1&"[/color] << endl; [bold]return[/bold] *[bold]this[/bold]; }
};
[bold]class[/bold] Trida2 {
Trida1 a;
[bold]public[/bold]:
Trida2() : a(4) {}
};
[bold]class[/bold] Trida3 {
Trida1 a;
[bold]public[/bold]:
Trida3() { a = 3; }
};
[bold]int[/bold] main([bold]int[/bold] argc, [bold]char[/bold] *argv[])
{
cout << [color=red]"Prvni"[/color] << endl;
Trida2 t2;
cout << [color=red]"Druhy"[/color] << endl;
Trida3 t3;
system([color=red]"PAUSE"[/color]);
[bold]return[/bold] EXIT_SUCCESS;
}
[/code]
Implicitním konstruktorem se v C++ myslí konstruktor, který lze použít automaticky ke konverzi. Tzn. je jednoparametrický a parametrem je nějaký jiný typ. V tomto případě tedy int. V zadané situaci se použije v obou případech, rozdíl je v tom, že v první situaci musí existovat, ale může být i explicitní a použije ho překladač stejně, ve druhém případě musí buď existovat operator=(int) nebo tento implicitni konstruktor a operator=(const Object&), ten si ale překladač umí vygenerovat. Kdyby parametrem navíc nebyl int, ale nějaká třída, tak by ještě úlohu mohly sehrát přetypovací operátory.
Ten popis je tak nesrozumitelnej, že bych radši doporučil si zkusit pohrát s následujícím příkladem -- odkomentovat/zakomentovat slovo explicit, odkomentovat/zakomentovat řádek začínající // a zkusit pochopit, co to dělá
[code][color=green]#include[/color]
[color=green]#include[/color]
[bold]using[/bold] [bold]namespace[/bold] std;
[bold]class[/bold] Trida1 {
[bold]public[/bold]:
Trida1() { cout << [color=red]"Bezparametricky konstruktor"[/color] << endl; }
[color=blue]/*[bold]explicit[/bold]*/[/color] Trida1([bold]int[/bold] x) { cout << [color=red]"Konstuktor s parametrem "[/color] << x << endl; }
[color=blue]// Trida1& [bold]operator[/bold]=([bold]int[/bold] x) { cout << "Prirazovaci [bold]operator[/bold] " << x << endl; [bold]return[/bold] *[bold]this[/bold]; }[/color]
Trida1& [bold]operator[/bold]=([bold]const[/bold] Trida1&) { cout << [color=red]"Prirazovaci [bold]operator[/bold] [bold]const[/bold] Trida1&"[/color] << endl; [bold]return[/bold] *[bold]this[/bold]; }
};
[bold]class[/bold] Trida2 {
Trida1 a;
[bold]public[/bold]:
Trida2() : a(4) {}
};
[bold]class[/bold] Trida3 {
Trida1 a;
[bold]public[/bold]:
Trida3() { a = 3; }
};
[bold]int[/bold] main([bold]int[/bold] argc, [bold]char[/bold] *argv[])
{
cout << [color=red]"Prvni"[/color] << endl;
Trida2 t2;
cout << [color=red]"Druhy"[/color] << endl;
Trida3 t3;
system([color=red]"PAUSE"[/color]);
[bold]return[/bold] EXIT_SUCCESS;
}
[/code]
Citovat příspěvek