Важным отличием, которое, кажется, еще никто не упомянул, является следующее:
Myclass mc = new Myclass();
в C #, это только правильный способ создания нового объекта. Когда вам нужен объект, вот как вы его создаете.
MyCppClass *mcCppClass = new MyCppClass();
В C ++ это то, как вы можете создать объект, и как иногда приходится создавать объект. Проблема с использованием этого подхода в C ++ заключается в том, что:
new
является чрезвычайно медленным в C / C ++ по сравнению с управляемым языком. Если используется для выделения каждого нужного вам объекта, это будет больно.
- Объект не имеет фиксированного времени жизни. Он размещается в куче и не уничтожается, пока вы не вызовете
delete
. Если вы забудете это сделать, он никогда не будет уничтожен. Если вы дважды наберете delete
, ваша программа взорвется.
В C ++ у вас есть два способа создания объектов:
Тот, который вы использовали выше:
// 1
MyCppClass *myobject = new MyCppClass();
delete myobject;
, но также изменен и включает вызов delete
, потому что без него вы теряете память. Всякий раз, когда вы используете new
, вы также должны рано или поздно позвонить delete
, В общем, одно без другого - ошибка.
И второй, более распространенный подход:
// 2
MyCppClass myobject;
Второй, в некотором смысле, больше похож на ваш пример на C #. Его временем жизни автоматически управляет система (хотя способ управления им различен. В C ++ он длится до тех пор, пока не выйдет из области видимости, а в C # он длится до тех пор, пока никто не ссылается на него и не получает мусор - но в обоих случаях , вам не нужно ничего делать, чтобы убедиться, что он уничтожен). Как правило, это также правильный способ создания экземпляров объекта по той же причине.
Одна из наиболее распространенных ошибок, допущенных новыми программистами на C ++, заключается в использовании new
для выделения каждого объекта, сохранения указателей на них, а затем попытки , чтобы не забыть удалить их. Более простое, надежное и эффективное решение - избегать new
и избегать указателей, насколько это возможно. Иногда вам нужен объект, время жизни которого не ограничено объявленной областью действия (и где копирование объекта не является вариантом для использования его вне этой области). Затем вы используете new
и, скорее всего, оберните полученный указатель в интеллектуальный указатель какого-либо типа.