Więc, co jest rzeczą z klas posiadających „*” w nazwie (na przykład zajęcia bez pliku .cpp nie masz Asterix, wszyscy inni) ?? ?
Zdecydowanie trzeba poznać wskaźniki. test *
i test
to dwa zupełnie różne typy w C++. Oto dwie zmienne z tymi typami:
test t;
test* p;
tutaj, t
ma typ test
i p
jako typ test*
. Opisujemy test*
jako "wskaźnik do test
".
Często można myśleć o wskaźniku jako o adresie pamięci obiektu. Tak więc w p
, ponieważ jest to wskaźnik, możemy zapisać adres pamięci t
, który jest test
. Aby uzyskać adres obiektu, używamy jednoargumentowy &
operatora, tak jak poniżej:
test t;
test* p = &t;
Zauważ, że t
jesttest
przedmiot. Nie trzeba było mówić new test()
. To jest, gdzie C++ różni się od innych języków, które mogłeś używać, takich jak C# i Java. W powyższym kodzie C++ t
jest obiektem test
.
Możesz jednak może utworzyć obiekty z new test()
, więc jaka jest różnica?
test t;
tworzy obiekt test
z automatycznym czasem przechowywania. Oznacza to, że jest niszczony na końcu swojego zakresu (często funkcja jest deklarowana w ramach).
new test()
tworzy obiekt test
z dynamicznym czasem przechowywania. Oznacza to, że musisz ręcznie zniszczyć obiekt, w przeciwnym razie wystąpi przeciek pamięci. To wyrażenie zwraca wskaźnik i tak można zainicjować obiektu wskaźnika z nim:
test* p = new test();
Więc teraz przyjrzyjmy się swojego problemu:
test t=new test("rrr",8);
Teraz wiemy, że new test("rrr", 8)
zwraca wskaźnik do test
(a test*
). Jednak próbujesz przypisać go do obiektu test
. Po prostu nie możesz tego zrobić. Jednym z nich jest adres, a drugi to test
. W związku z tym kompilator mówi "nie ma odpowiedniego konstruktora do przekonwertowania z test *
do test
." To ma sens, prawda?
Zamiast tego należy używać automatycznego czasu przechowywania. Używaj tylko new
, jeśli naprawdę potrzebujesz. Tak po prostu:
test t("rrr", 8);
Miło, twoja odpowiedź jest znacznie lepsza niż moja :) +1 –
tnx dużo. zgadłeś, zrobiłem programowanie w java i C# tak im trochę walczę z C++ :) .... – klo
@klo Jeśli spróbujesz zaprogramować C++ tak, jak zaprogramowałeś Javę, zrobisz mnóstwo błędów. Nie są wcale bardzo podobne. – john