Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Конструкторы и деструкторы


Автор: GLeBaTi 1.2.2008, 18:55
я уже много раз встречал термин "конструктор", я знаю где и как его писать, но никак не могу понять его предназначение.
 Зачем он нужен вообще ?

Автор: JackYF 1.2.2008, 19:02
Цитата(GLeBaTi @  1.2.2008,  17:55 Найти цитируемый пост)
Зачем он нужен вообще ? 

Инициализация. Когда ты создаешь объект, для него вызывается "конструктор".

Автор: GLeBaTi 1.2.2008, 19:44
Значит если создаешь объект, то обязательно надо создать конструктор ? 
А если не зоздать, что будет ?

Автор: JackYF 1.2.2008, 20:20
Цитата(GLeBaTi @  1.2.2008,  18:44 Найти цитируемый пост)
А если не зоздать, что будет ? 

Будет вызван конструктор по-умолчанию, который не делает ничего.

Автор: GLeBaTi 1.2.2008, 21:02
Значит при каждом обращении к объекту, вызывается его конструктор или только один раз ?

                                                                                                                          заранее спасибо за ответ!

Автор: Exai1e 1.2.2008, 21:37
Код

Будет вызван конструктор по-умолчанию, который не делает ничего. 


Не ну почему же, он делает чтото, вот ток надо глянуть в конструкторе этого класса что он делает smile ;)

Автор: JackYF 1.2.2008, 21:44
Цитата(Exai1e @  1.2.2008,  20:37 Найти цитируемый пост)
Не ну почему же, он делает чтото, вот ток надо глянуть в конструкторе этого класса что он делает

Сам понял, что сказал? smile Если конструктора не будет, он будет делать что-то?  smile 

Автор: new_web 1.2.2008, 22:25
Ну, почему-же? Любой конструктор ,что-то да и делает - выделяет память для переменных, может их инициализировать началными значениями, договаривается с виндовс smile 
если в unit.h
Код

class TSomeConstruct//
{
private:
int i;
public:
TSomeConstruct();//конструктор
~TSomeConstruct();//деструктор
};

то в unit.срр
Код

#include "main.h"//заголовочынй файл. где  форма, и всё что с ней.
TSomeConstruct::TSomeConstruct()
{
Form1-> Label1->Caption="Это же я, конструктор!)))))))";
i=12345;
//получилось, чо конструктор., на всю жизнь задал значение приватного параметра i
}

Полезно там инициализировать разные данные. данные - типа:"по-умолчанию"
Так класс отвечает сам за инициализуцию своих параметов, не полагаясь на стооннюю функцию, в наше время никому верить нельзя!
Для каждого объекта любого класса создаётся только один контруктор, и один деструктор - который освобождает память, уничтожает ПЕРЕМЕННЫЕ, И ТАК ДАЛЕЕ
деструктор в действии можно увидеть:
Код

TSomeConstruct::~TSomeConstruct()
{
ShowMessage("Ай-яй-яй, убили обьект типа TSomeConstruct, убили обьект типа TSomeConstruct");
}



Автор: JackYF 1.2.2008, 22:58
Ну, если по-хорошему, то конструктор по-умолчанию не выделяет никому память и не задаёт никому значения. Всё, что он делает - это вызывает конструкторы по-умолчанию членов класса/структуры.

Автор: Любитель 1.2.2008, 23:00
Цитата(new_web @  1.2.2008,  22:25 Найти цитируемый пост)
выделяет память для переменных

Эт чего он должен выделять? Если объект стековый, память резервируется при входе в функцию. Но о выделении речи здесь нет - просто компилятор должен знать размер объекта (скока выделять под фрейм локальных переменных).

Цитата(new_web @  1.2.2008,  22:25 Найти цитируемый пост)
может их инициализировать началными значениями

Странная формулировка - может так, может не так... Но доля истины есть smile

Цитата(new_web @  1.2.2008,  22:25 Найти цитируемый пост)
договаривается с виндовс

А о чём он должен с ней договариваться? smile 

Конструктор по умолчанию формально всё, что делает - вызывает дефолтный конструктор классов предков и конструкторы всех полей, не являющихся встроенными типами.

Автор: archimed7592 1.2.2008, 23:01
Цитата(JackYF @  1.2.2008,  20:20 Найти цитируемый пост)
который не делает ничего.

Код

struct L
{
    L()
    {  std::cout << "hi" << std::endl; }
};
struct D
    :   public L
{ };
struct A
{
    L l;
};

D d; // выведет hi
A a; // выведет hi

Ничего не делает только тривиальный конструктор.

Цитата(new_web @  1.2.2008,  22:25 Найти цитируемый пост)
выделяет память для переменных
Да нет, выделять память под объект - это не в компетенции конструктора.

Автор: Любитель 1.2.2008, 23:02
PS А вообще по таким вопросам -  smile 

Автор: GLeBaTi 1.2.2008, 23:28
Всё, я понял, спасибо  smile 

                              можете удалять тему

Автор: new_web 1.2.2008, 23:33
Цитата(archimed7592 @ 1.2.2008,  23:01)


Цитата(new_web @  1.2.2008,  22:25 Найти цитируемый пост)
выделяет память для переменных
Да нет, выделять память под объект - это не в компетенции конструктора.

Да, конечно, и я прошу прощение, что возможно ввёл кого-то в заблуждение!
НО. так или иначе конструктор объявляет всей видимости, что надо выделить память под переменную некотороего типа. Кто там куда чего где выделяет - это уже другой вопрос.
Ну, а "договор с виндовс" можно увидеть если в пошаговом режиме зайти в функцию, ...там столько всего...непонятного...но понимаю. что програму открывает и показывает и закрывает виндовс...
вся эта работа для програмиста сделана уже, согласно концепции ООП... 
Создатели уже побеспокоились о том как заставить виндовс показать окно...было бы что в нём показывать...

Автор: archimed7592 2.2.2008, 00:41
Цитата(new_web @  1.2.2008,  23:33 Найти цитируемый пост)
так или иначе конструктор объявляет всей видимости, что надо выделить память под переменную некотороего типа.

Этим занимается не конструктор(если вообще кто-либо занимается smile).


Цитата(new_web @  1.2.2008,  23:33 Найти цитируемый пост)
Ну, а "договор с виндовс" можно увидеть если в пошаговом режиме зайти в функцию, ...там столько всего...непонятного...но понимаю. что програму открывает и показывает и закрывает виндовс...

Скомпилируй код, что я выше привёл и зайди в ctor в пошаговом режиме - ничего непонятного ты не увидишь.
Если бы на каждый объект программа "договаривалась бы с виндовс", то они бы точно не договорились бы...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)