Подтвердить что ты не робот

Различные методы для создания объекта в С++

В чем разница между этим:

Myclass *object = new Myclass();

и

Myclass object = new Myclass();

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

4b9b3361

Ответ 1

Второе неверно!

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

MyClass object;

Это будет работать.

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

Ответ 2

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)

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

Ответ 3

Ваша первая строка на 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;

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Неверный код выше, чем новый класс 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 

Ответ 7

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

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