2009-03-24 16 views
28

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?

Odpowiedz

36

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.

8

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 *.

7

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.

3

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ęć.

53
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).

6

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 
10

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; 
Powiązane problemy