Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
#1

Внутреннее представление конструтора и деструктора - C++

03.08.2009, 07:07. Просмотров 1167. Ответов 15
Метки нет (Все метки)

Я знаю, что конструктор и деструктор в явном виде ничего не возвращает.
Однако на уровне ассемблерных команд он восстанавливает содержимое вершины стека(в регистр, ячейку памяти или сегментый регистр).
Какой тип в теории может возвращать конструктор и деструктор?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2009, 07:07     Внутреннее представление конструтора и деструктора
Посмотрите здесь:

Внутреннее представление числа в памяти - C++
нужно сделать реализацию числа в памятиfloat d1 = 72.9e-8;... а как??? это нужно число перевести в двоичную систему, или как???

Перевод десятичного числа во внутреннее представление - C++
Всем привет. Сделал программу перевода десятичного числа во внутреннее представление. Число лежит в диапазоне от -128 до 127 (тип char)....

Внутреннее (машинное) представление данных двух типов - C++
Разработать программу, которая выводит на экран внутреннее (машинное) представление данных двух типов:short int и long double. Обеспечить...

Внутреннее представление типа Double через Long - C++
Привет. Для оптимизации работы одного вычислительного алгоритма потребовалось найти некое биективное отображение Double <-> Long для...

Перевод даты из символьного формата во внутреннее представление и обратно - C++
Разработать функцию, которая переводит дату из символьного формата «дд.мм.гггг» во внутреннее представление и обратно.Только чтобы не...

Программа показывающая внутреннее двоичное представление типа данных - C++
Необходимо показать внутреннее двоичное представление типа данных, используя операции сдвига(<<,>>) и поразрядные логические операции...

Внутреннее устройство потоков - C++
Очень тупой вопрос - почему std::ios хранит в своих потрохах указатель на объект std::streambuf, а не является потомком std::streambuf?...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
03.08.2009, 08:00     Внутреннее представление конструтора и деструктора #2
Цитата Сообщение от Skirmisher Посмотреть сообщение
Однако на уровне ассемблерных команд он восстанавливает содержимое вершины стека(в регистр, ячейку памяти или сегментый регистр).
он инициализирует переменные.
в вершине стека всего лишь значения "по-умолчанию".
и, насколько я знаю, ничего конструктор не возвращает, даже на внутреннем уровне.
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
03.08.2009, 08:53  [ТС]     Внутреннее представление конструтора и деструктора #3
Цитата Сообщение от Patch Посмотреть сообщение
он инициализирует переменные.
в вершине стека всего лишь значения "по-умолчанию".
и, насколько я знаю, ничего конструктор не возвращает, даже на внутреннем уровне.
Значит в теории он void.
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
03.08.2009, 10:13     Внутреннее представление конструтора и деструктора #4
можно считать, что он возвращает ссылку на созданный объект. хорошо это видно, например, на таком примере
C++
1
myclass * e = new myclass(params);
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
03.08.2009, 10:17     Внутреннее представление конструтора и деструктора #5
Неверно. Здесь возвращает значение operator new, а вовсе не конструктор.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
03.08.2009, 10:30     Внутреннее представление конструтора и деструктора #6
2CheshireCat: Оператор new и конструктор тесно связаны. Оператор new выделяет память, а конструктор заполняет выделенную память.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
03.08.2009, 10:40     Внутреннее представление конструтора и деструктора #7
Цитата Сообщение от odip Посмотреть сообщение
2CheshireCat: Оператор new и конструктор тесно связаны. Оператор new выделяет память, а конструктор заполняет выделенную память.
конструктор не заполняет память, выделяемую под объект, он может инициализировать дополнительные (внутренние объекты) но сам по себе в память объекта он не лезет. Это метод, который вызывается уже после создания объекта.
достаточно посмотреть простой пример (в какой последовательности и что будет создаваться):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct CSomeStruct
{
// реализация
};
 
class CSomeClass
{
public:
    CSomeClass()
    {
        SomeStruct; // уже создана, 
        //т.е. this уже существует и под него уже выделена память
        pSomeStruct = new CSomeStruct;
     }
private:
    CSomeStruct SomeStruct;
    CSomeStruct *pSomeStruct;
};
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
03.08.2009, 10:44     Внутреннее представление конструтора и деструктора #8
C++
1
2
3
4
5
6
class ExampleClass {
public:
int value1;
 
ExampleClass() { value1= 5; }
};
Вот тебе конструктор, который заполняет память объекта - поле value1.

Добавлено через 57 секунд
Это метод, который вызывается уже после создания объекта
Что значит после создания объекта ?
А это как раз и значит, что память была выделена оператом new или компилятором.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
03.08.2009, 10:49     Внутреннее представление конструтора и деструктора #9
Цитата Сообщение от odip Посмотреть сообщение

Вот тебе конструктор, который заполняет память объекта - поле value1.
он не заполняет память, он устанавливает значение, переменной. Память была выделена оператором new (либо на стеке) а только после этого вызван контруктор.
Добавлено через 57 секунд
Цитата Сообщение от odip Посмотреть сообщение
Что значит после создания объекта ?
А это как раз и значит, что память была выделена оператом new или компилятором.
выделяется кусок памяти поз объект оператом new и ничего больше, а дальше вызывается конструктор объекта.
поставь в моем примере брейкпоинты и пройди по шагам, и сразу поймешь в какой последовательности что вызывается.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
03.08.2009, 10:52     Внутреннее представление конструтора и деструктора #10
odip,
Оператор new и конструктор тесно связаны.
struct Foo {};
Foo* foo = (Foo*) ::operator new (sizeof(Foo));
обозначь здесь связь, а то что-то не могу найти ...

а конструктор заполняет выделенную память.
Чем именно? То есть конструктор можно использовать как замену memset?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 12:11     Внутреннее представление конструтора и деструктора #11
Цитата Сообщение от Rififi Посмотреть сообщение
Foo* foo = (Foo*) ::operator new (sizeof(Foo));
обозначь здесь связь, а то что-то не могу найти ...
Rififi, odip имел ввиду оператор new, а не функцию operator new
***
Рассмотрим на простом примере что происходит:
C++
1
2
// оператор new
string *sp = new string("hello");
Когда используется оператор new, выполняется 3 действия:
1) Выражение вызывает библиотечную функцию operator new(), резервирующую нетипизированную область памяти, достаточно большую, чтобы содержать объект указанного типа.
2) Чтобы создать объект на основании переданного инициализирующего значения, запускается конструктор соответствующего класса
3) Возвращается указатель на вновь созданный объект.

И для симметрии рассмотрим, что делает оператор delete
C++
1
delete sp;
1) Выполняется деструктор, соответствующий классу объекта, на который указывает указатель sp
2) Используемая объектом память освобождается при помощи библиотечной функции operator delete()
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
03.08.2009, 12:15     Внутреннее представление конструтора и деструктора #12
zim22,
Rififi, odip имел ввиду оператор new, а не функцию operator new
Собстна, это я и желал выяснить (Ж
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
03.08.2009, 13:27     Внутреннее представление конструтора и деструктора #13
2 zim22
если для объекта перегружен оператор, то он будет работать так как реализовано в перегрузке, иначе создается объект а потом вызывается конструктор (нет смысла вызывать конструктор (или любой другой нестатический метод), если this невалидный).
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 13:30     Внутреннее представление конструтора и деструктора #14
Цитата Сообщение от oxotnik Посмотреть сообщение
2 zim22
что вы хотели этим сказать? что я где-то ошибся? укажите на ошибку. я не понимаю смысл вашего сообщения.
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
03.08.2009, 13:46     Внутреннее представление конструтора и деструктора #15
Цитата Сообщение от zim22 Посмотреть сообщение
что вы хотели этим сказать? что я где-то ошибся? укажите на ошибку. я не понимаю смысл вашего сообщения.
то что (я не лазил в исходники stl) если есть
string::operator new(...)
то вызовется он с заложенной в нем логикой выделения и распределения памяти и вызовется конструктор там где он вызывается в теле string::operator new(...)
если нет, тогда выделится память под объект а потом вызовется конструктор
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2009, 14:17     Внутреннее представление конструтора и деструктора
Еще ссылки по теме:

Отключение деструктора - C++
Вопрос такой. Возможно ли каким-то образом предотвратить вызов деструктора при уничтожении объекта? У меня есть вот такой класс самодельных...

Вызов деструктора - C++
Есть написанный мною код: #include <iostream> class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Описание деструктора - C++
Пример: #include<iostream> using namespace std; class A { int A; };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
03.08.2009, 14:17     Внутреннее представление конструтора и деструктора #16
Цитата Сообщение от oxotnik Посмотреть сообщение
если есть string::operator new(...), то вызовется он с заложенной в нем логикой выделения и распределения памяти
логично
Yandex
Объявления
03.08.2009, 14:17     Внутреннее представление конструтора и деструктора
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru