Создание объекта на C

#c #oop

#c #ооп

Вопрос:

Я сомневаюсь в создании объектов на C .
Допустим, у меня есть класс с именем Employee с некоторыми элементами данных и методами.

Теперь в основной функции иногда я видел, как разработчики используют разные методы для создания объектов, таких как

 Employee emp1;                // 1)
Employee emp2 = new Employee  // 2)
  

Я сомневаюсь, когда мы должны использовать вариант 1 и когда использовать вариант 2.

Комментарии:

1. Я думаю, вы имеете в виду: 2) Сотрудник * emp2 = новый сотрудник

2. Это зависит от того, как вы хотите управлять временем жизни объекта.

3. @dreamlax — как бы вы ни хотели управлять временем жизни, синтаксис samprats не будет работать. Вы не можете присвоить Employee* переменной значение (возвращаемое new Employee ) Employee , я полагаю, если вы не определяете какое-то очень неправдоподобное приведение.

Ответ №1:

1) emp1 сотрудника;

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

2) emp2 = новый сотрудник

Вероятно, это даже не компилируется, я думаю, вы имели в виду:

2) Сотрудник * emp2 = новый сотрудник

Это создает сотрудника, созданного по умолчанию, в куче и присваивает его адрес указателю сотрудника. Его время жизни длится до тех пор, пока delete он не будет вызван для него.

Это две совершенно разные вещи. Пока вы не узнаете об этом больше, вы, вероятно, захотите придерживаться первой версии. Как только вы узнаете об этом больше, вам также следует придерживаться первой версии, если вы не знаете и не понимаете причин, по которым этого не следует делать.

Комментарии:

1. @Shakedown — если вы используете синтаксис в качестве определения элемента в классе или структуре, элемент будет создан везде, где создается экземпляр класса, и это вполне может быть в куче. Этот синтаксис также можно использовать для глобальных переменных, которых нет ни в куче, ни в стеке. Однако, если это объявление локальной переменной в функции (как предполагает контекст), то оно, безусловно, находится в стеке.

2. @Loki — Стек и куча — это концепции Java??? Нет, нет, нет… Стек (в данном контексте) изначально был концепцией машинного кода, а куча — концепцией структуры данных с давних времен. Во всяком случае, это различие более актуально в C , потому что оно имеет отношение к проблемам производительности и корректности (например, висячие указатели).

3. @Steve314: В C нет требования к стеку (проверьте стандарт). Также у меня есть аппаратное обеспечение реализации, у которого даже нет памяти, не говоря уже о стеке ( архитектура потока данных). Термин «стек / куча», используемый в этом контексте, был перенесен из мира Java, как он и был определен. Хотя Java унаследовала стек из мира машинного кода (как и большинство языков).

4. Вздох. Случай 1) имеет «автоматическую» продолжительность хранения в отличие от «статической» продолжительности хранения. «автоматический» означает разные вещи в разных контекстах. Если он находится в блоке области видимости функции, то объект исчезает в конце области видимости. Если он является членом класса, он исчезает после завершения деструктора для класса. Если он находится в глобальной области видимости, он исчезает при завершении программы.

5. Но это почему-то не по теме. Моя первоначальная точка зрения такова. Представление о терминах стека и кучи (для начинающих) является определяющим в C . Единственный чистый способ думать об объектах — это с точки зрения продолжительности жизни. Автоматические объекты имеют жизненный цикл в зависимости от их родительского контекста. Больше ничего не важно.