Способ создания и инициализация

Рассмотрим ряд моментов связанных с созданием и уничтожением. \

Первый это стек и куча. Вопрос о выделении памяти через стек или кучу связан с тем как выделяется и освобождается память. Разделяют автоматические и динамические переменные. Для автоматических переменных память создается при входе в процедуру или блок, управляющие этими переменными. При выходе из блока память (автоматически) освобождается. Многие языки используют термин статический (static) для обозначения переменных, автоматически размещаемых в стеке. (В данном случае речь не идет о переменных типа static в С++). Для динамического выделения памяти используется оператор new. Память выделяется по специальному запросу со стороны пользователя.

Автоматические переменные уничтожаются автоматически, динамические по запросу со стороны пользователя ключевым словом delete в С++. В Java нет освобождения памяти, осуществляется процесс сборки мусора – автоматически отслеживается ситуация, когда к объекту нет доступа.

Указатели – это эффективное средство работы с динамической информацией. В языке Java объекты представлены внутренним образом как указатели, но при этом никогда не используются в таком качестве.

Создание и инициализация в С++. Конструкторы.

Использование для обеспечения инициализации объекта класса функций вроде set_date() (установить дату) неэлегантно и чревато ошибками. Поскольку нигде не утверждается, что объект должен быть инициализирован, то программист может забыть это сделать, или (что приводит, как правило, к столь же разрушительным последствиям) сделать это дважды. Есть более хороший подход: дать возможность программисту описать функцию, явно предназначенную для инициализации объектов. Поскольку такая функция конструирует значения данного типа, она называется конструктором. Конструктор распознается по тому, что имеет то же имя, что и сам класс. Например:

class date {

date(int, int, int);

};

Метод конструктор автоматически и неявно вызывается каждый раз, когда создается объект, принадлежащий к соответствующему классу. Это происходит или во время объявления переменной или, когда объект создается динамически с помощью оператора new или когда применяются временные переменные.
Часто бывает хорошо обеспечить несколько способов инициализации объекта класса. Это можно сделать, задав несколько конструкторов. Например:

class date {
int month, day, year;
public:

date(int, int, int); // день месяц год
date(char*); // дата в строковом представлении
date(int); // день, месяц и год сегодняшние
date(); // дата по умолчанию: сегодня
};

data::data(){
month=01, day=22, year=1999;
}

date today(4);
date july4("Июль 4, 1983");
date now; // инициализируется по умолчанию
Тело конструктора часто представляет собой последовательность операторов присваивания. Они могут быть заменены инициализаторами в заголовке функции.

Data(int x,int y,int z):month(x),day(y),year(z) {}

Динамическое создание переменной выглядит следующим образом.

Data *d, *g;
D=new data(1,3,1987);
G=new data;
Конструкторы подчиняются тем же правилам относительно типов параметров, что и перегруженные функции. Если конструкторы существенно различаются по типам своих параметров, то компилятор при каждом использовании может выбрать правильный.
Размножение конструкторов в примере с date типично. При разработке класса всегда есть соблазн обеспечить "все", поскольку кажется проще обеспечить какое-нибудь средство просто на случай, что оно кому-то понадобится или потому, что оно изящно выглядит, чем решить, что же нужно на самом деле. Последнее требует больших размышлений, но обычно приводит к программам, которые меньше по размеру и более понятны. Один из способов сократить число родственных функций - использовать параметры со значением по умолчанию, пример. В случае date для каждого параметра можно задать значение по умолчанию, интерпретируемое как "по умолчанию принимать: today" (сегодня).

class date {
int month, day, year;
public:
date(int d =0, int m =0, int y =0);
date(char*); // дата в строковом представлении
};


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: