pimpek Temat założony przez niniejszego użytkownika |
Inicjalizacja tablic obiektow » 2017-06-26 16:36:34 Cześć. Zastanawiam sie nad takim przykladem: #include <iostream> #include <string> using namespace std;
class Zwierze { string imie; int wiek; public: Zwierze( void ) : imie( "BRAK" ) , wiek( 0 ) { } Zwierze( const string im, int lata ) : imie( im ) , wiek( lata ) { } Zwierze( Zwierze & obiekt ) : imie( obiekt.imie ) , wiek( obiekt.wiek ) { cout << "Jestem tylko kopia"; } void pokaz() { cout << "Mam na imie:" << imie << " i mam lat:" << wiek << endl; } };
int main() { Zwierze kotek; Zwierze kot[ 10 ] = { kotek, Zwierze(), Zwierze( "Burek", 3 ) } Wyskakuja mi bledy ze jest zbyt wiele kandydatow na przeladowanei operatora. Nie rozumiem dlaczego, gdyby ktos byl laskaw mi to wyjasnic. i pokazac jak powinno wygladac poprawne wywolanie tego. Dzieki |
|
mokrowski |
» 2017-06-26 17:14:40 #include <iostream> #include <string>
class Zwierze { std::string imie; int wiek; public: Zwierze() : imie( "BRAK" ) , wiek( 0 ) { } Zwierze( const std::string & im, int lata ) : imie( im ) , wiek( lata ) { } Zwierze( const Zwierze & obiekt ) : imie( obiekt.imie ) , wiek( obiekt.wiek ) { std::cout << "Jestem tylko kopia"; } void pokaz() const { std::cout << "Mam na imie:" << imie << " i mam lat:" << wiek << std::endl; } };
int main() { Zwierze kotek; Zwierze kot[ 10 ] = { kotek, Zwierze(), Zwierze( "Burek", 3 ) }; }
A jak znajdziesz różnicę której nie potrafisz wyjaśnić, pytaj. |
|
pimpek Temat założony przez niniejszego użytkownika |
Roznica » 2017-06-26 17:39:57 i tylko, ten modyfikator const tyle zmienia? dlaczego? |
|
Monika90 |
» 2017-06-26 18:18:14 Argumentem funkcji której parametr jest typu T& nie może być obiekt tymczasowy, a w przypadku const T& może być. W starym C++, takie coś Zwierze kot[ 1 ] = { Zwierze() };
oznaczało utworzenie obiektu tymczasowego Zwierze(), a następnie utworzenie obiektu kot[0] za pomocą konstruktora kopiującego. Twój konstruktor kopiujący nie nadawał się do zrobienia kopii obiektu tymczasowego, bo brakowało const w parametrze. W praktyce konstruktor kopiujący mógł nie być wywołany w takiej sytuacji (tzw. copy elision), ale i tak musiał istnieć nadający się do użycia konstruktor kopiujący. W C++17 Twój kod da się skompilować bez zmian, ale i tak parametr konstruktora kopiującego powinien mieć const, bo są inne istotne powody ku temu. |
|
pimpek Temat założony przez niniejszego użytkownika |
.. » 2017-06-26 18:32:20 Aha, rozumiem. a co w przypadku tych pozostalych, obiektow ktorych jawnie nie zainicjowalem? np. kotek[8]? rozumiem ze w przypadku jawnym zainicjowania tego obiektu czyli: kotek[8]={Zwierze()} - jest uruchamiany konstruktor(bezargumentow)dla Zwierze(obiekt tymczasowy), a pozniej odpala sie konstruktor kopiujacy do utworzonego przed chwila obiektu kotek[8]? ( i w tym wypadku konstruktor kopiujacy musi byc const). a jak jawnie nie wywolam inicjalizacji kotke[8] ( czyli wgl go nie napisze miedzy klamrami?) czy wtedy nie jest identyczny tok postepowania kompilatora? |
|
Monika90 |
» 2017-06-26 18:39:58 Dla tych elementów tablicy, których nie zaincjalizowałeś jawnie, wywołany będzie konstruktor domyślny, konstruktor kopiujący nie będzie brał w tym udziału. |
|
mokrowski |
» 2017-06-26 20:24:27 Dodać jeszcze trzeba że warto dbać o opatrzenie metod które nie modyfikują atrybutów klas słowem kluczowym const. To zapewnia dodatkową kontrolę a słowo kluczowe const na liście przekazywanych parametrów (wskaźnik lub referencja), pozwala uniknąć zbędnego kopiowania. |
|
« 1 » |