Различные методы создания объекта в C ++ - PullRequest
39 голосов
/ 24 марта 2009

Какая разница между:

Myclass *object = new Myclass();

и

Myclass object = new Myclass();

Я видел, что многие библиотеки C ++, такие как wxWidgets, OGRE и т. Д., Используют первый метод ... Почему?

Ответы [ 7 ]

65 голосов
/ 24 марта 2009
Myclass *object = new Myclass(); //object has dynamic storage duration (usually is on the heap)
Myclass object; //object has automatic storage duration (usually is on the stack)

Вы создаете объекты с динамическим сроком хранения (обычно в куче), если вы планируете использовать их в течение длительного периода времени, и вы создаете объекты с автоматическим сроком хранения (обычно в стеке) на короткий срок (или область действия) .

39 голосов
/ 24 марта 2009

Второй не так!

Вы можете использовать

MyClass object;

Это сработает.

Теперь, что касается выбора между этими двумя возможностями, это в основном зависит от того, как долго должен жить ваш объект. См. там для подробного ответа.

17 голосов
/ 21 октября 2016

Ваша первая строка на 100% верна. К сожалению, вы не можете создать объект со своей второй строкой в ​​C ++. Есть два способа сделать / создать объект в c ++.

Первый:

MyClass myclass; // if you only need to call the default constructor    
MyClass myclass(12); // if you need to call constructor with parameters*

Второй:

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

В c ++, если вы используете ключевое слово new, объект будет храниться в куче. Это очень полезно, если вы используете этот объект в течение длительного периода времени, и если вы используете первый метод, он будет храниться в стеке. может быть использован только короткий период времени. Примечание: если вы используете ключевое слово new, помните, что оно вернет значение указателя. Вы должны объявить имя с *. Если вы используете второй метод, он не удаляет объект в куче. Вы должны удалить самостоятельно, используя ключевое слово delete:

delete myclass;
12 голосов
/ 24 марта 2009

Оператор new возвращает указатель на объект, который он создает, поэтому выражение Myclass object = new Myclass(); недопустимо.

Другие языки не имеют явных указателей, таких как C ++, поэтому вы можете писать операторы, такие как Myclass object = new Myclass();, но в C ++ это просто невозможно. Тип возвращаемого значения new Myclass(); является указателем на объект Myclass, т.е. Myclass *.

7 голосов
/ 24 марта 2009

В первом примере создается указатель на MyClass и инициализируется, чтобы он указывал на результат нового оператора.

Второй, скорее всего, не скомпилируется, так как он пытается создать объект MyClass и назначить его указателю MyClass. Это может сработать в маловероятном случае, если у вас есть конструктор MyClass, который принимает указатель MyClass.

6 голосов
/ 08 июля 2016

Ваша первая строка кода правильная, в то время как вторая строка кода неверна.

Myclass object=new Myclass();  //Incorrect code

Указанный выше код неверен: new Myclass (); возвращает указатель на класс и объект Myclass; объявляет объект класса, и вы пытаетесь присвоить указатель на класс объекту класс, который неверен.

Ваша первая строка кода верна. Но это объявляет указатель на класс, а не объект класса.

Myclass *object = new Myclass();  //declares pointer to class.

Чтобы объявить объект класса, вы должны написать следующий код.

Myclass object;   //declares object of class Myclass

Но вы должны заметить, что способ доступа к члену класса с помощью указателя на класс и с использованием объекта класса различен. Ниже приведен код для доступа к членам класса.

pointer_to_class->member;  // accessing class member using pointer to class
object.member;             //accessing class member using object of class 
3 голосов
/ 24 марта 2009

Первое правильно.

Второй обычно не компилируется. И если он компилируется, класс выполняет сложные операции в конструкторе / операторе присваивания. И это, вероятно, утечка памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...