Jaka jest różnica między tym:Różne metody instancji obiektu w C++
Myclass *object = new Myclass();
i
Myclass object = new Myclass();
Widziałem, że sporo C++ biblioteki jak wxWidgets Ogre etc używać pierwszy metoda ... Dlaczego?
Jaka jest różnica między tym:Różne metody instancji obiektu w C++
Myclass *object = new Myclass();
i
Myclass object = new Myclass();
Widziałem, że sporo C++ biblioteki jak wxWidgets Ogre etc używać pierwszy metoda ... Dlaczego?
Druga jest błędna!
Można użyć
MyClass object;
który będzie działał.
Teraz, jeśli chodzi o wybór między tymi dwoma możliwościami, zależy to głównie od tego, jak długo obiekt powinien żyć. Aby uzyskać dokładną odpowiedź, patrz there.
Operator new
zwraca wskaźnik do obiektu, który tworzy, więc wyrażenie Myclass object = new Myclass();
jest nieprawidłowe.
Inne języki nie mają wyraźnych wskaźników, takich jak C++, więc można pisać instrukcje, takie jak Myclass object = new Myclass();
, ale w C++ jest to po prostu niemożliwe. Typ zwracany new Myclass();
jest wskaźnikiem do obiektu Myclass
, to jest Myclass *
.
Pierwszy przykład tworzy wskaźnik do MyClass i inicjalizuje go tak, aby wskazywał na wynik nowego operatora.
Drugi prawdopodobnie nie będzie się kompilował, ponieważ próbuje utworzyć obiekt MyClass i przypisać go do wskaźnika MyClass. Może to zadziałać w mało prawdopodobnym przypadku, gdy masz konstruktor MyClass, który akceptuje wskaźnik MyClass.
Pierwsza jest prawidłowa.
Druga generalnie nie będzie się kompilować. A jeśli skompiluje, to klasa robi skomplikowane rzeczy w operatorze konstruktora/przypisania. I to prawdopodobnie wyciekająca pamięć.
Myclass *object = new Myclass(); //object is on the heap
Myclass object; //object is on the stack
tworzyć obiekty na stercie jeśli planujesz używać ich przez długi okres czasu i tworzenia obiektów na stosie dla krótkiego życia (lub zakresu).
Twoja pierwsza linia kodu jest poprawna, a druga linia kodu jest niepoprawna.
Myclass object=new Myclass(); //Incorrect code
Powyższy kod jest niepoprawny jako new Myclass(); zwraca wskaźnik do klasy i Obiekt Myclass; deklaruje obiekt klasy i próbujesz przypisać wskaźnik do klasy do obiektu klasy, który jest niepoprawny.
Twoja pierwsza linia kodu jest poprawna. Ale to deklaruje wskaźnik do klasy, a nie obiekt klasy.
Aby zgłosić obiekt klasy, należy napisać następujący kod.
Myclass object; //declares object of class Myclass
Należy jednak zauważyć, że sposób dostępu do elementu klasy za pomocą wskaźnika do klasy i przy użyciu obiektu klasy są różne. Poniżej znajduje się kod dostępu do członków klasy.
pointer_to_class->member; // accessing class member using pointer to class
object.member; //accessing class member using object of class
Twoja pierwsza linia jest w 100% poprawna. Niestety, nie możesz utworzyć obiektu z drugą linią w C++. Istnieją dwa sposoby tworzenia/tworzenia obiektów w języku C++.
Pierwszy z nich to:
MyClass myclass; // if you only need to call the default constructor
MyClass myclass(12); // if you need to call constructor with parameters*
drugi jest:
MyClass *myclass = new MyClass();// if you only need to call the default constructor
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters
w C++, jeśli używasz słowa kluczowego new
, obiekt zostanie zapisany w stercie. Jest to bardzo przydatne, jeśli używasz tego obiektu przez dłuższy czas i jeśli użyjesz pierwszej metody, będzie on przechowywany w stosie. może być używany tylko przez krótki czas. Uwaga: jeśli użyjesz słowa kluczowego new
, pamiętaj, że zwróci ono wartość wskaźnika. Należy zadeklarować nazwę pod numerem *
. Jeśli użyjesz drugiej metody, nie usuniesz obiektu ze sterty. Musisz usunąć samodzielnie, używając: delete
słowo kluczowe:
delete myclass;