В чем разница между этим:
Myclass *object = new Myclass();
и
Myclass object = new Myclass();
Я видел, что многие библиотеки С++, такие как wxWidgets, OGRE и т.д., используют первый метод... Почему?
В чем разница между этим:
Myclass *object = new Myclass();
и
Myclass object = new Myclass();
Я видел, что многие библиотеки С++, такие как wxWidgets, OGRE и т.д., используют первый метод... Почему?
Второе неверно!
Вы можете использовать
MyClass object;
Это будет работать.
Теперь, касаясь того, как выбирать между этими двумя возможностями, это в основном зависит от того, как долго ваш объект должен жить. Подробнее см. .
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)
Вы создаете объекты с динамическим сроком хранения (обычно в куче), если планируете использовать их в течение длительного периода времени, и вы создаете объекты с автоматическим сроком хранения (обычно в стеке) на короткий срок (или область действия).
Ваша первая строка на 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;
Оператор new
возвращает указатель на объект, который он создает, поэтому выражение Myclass object = new Myclass();
недействительно.
На других языках нет явных указателей, таких как С++, поэтому вы можете писать операторы типа Myclass object = new Myclass();
, но на С++ это просто невозможно. Тип возврата new Myclass();
является указателем на объект Myclass
, т.е. Myclass *
.
Первый пример создает указатель на MyClass и инициализирует его, указывая на результат нового оператора.
Второй, скорее всего, не будет компилироваться, поскольку он пытается создать объект MyClass и назначить его указателю MyClass. Это может работать в маловероятном случае, когда у вас есть конструктор MyClass, который принимает указатель MyClass.
Ваша первая строка кода верна, а вторая строка кода неверна.
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
Первое правильно.
Второй, как правило, не компилируется. И если он компилируется, то класс выполняет некоторые сложные вещи в операторе конструктора/присваивания. И это, вероятно, утечка памяти.