Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/70: Рейтинг темы: голосов - 70, средняя оценка - 4.71
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15

[C++] Взятие адреса конструктора. Физическое время существование объекта.

16.02.2012, 15:40. Показов 15726. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. конструктор.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
 
int a;
public:
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это вызов конструктора - явный. он используется контейнерами stl.
//вывод - конструктор можно вызвать явно и с параметрами и без.
// возвращается некий указатель на начало объекта
};
Вопрос: если объект начинается с конструктора, то полученный нами указатель - будет указывать на конструктор? и только высокоуровневые ограничения не дают нам видеть его среди членов объекта и работать с ней. Если это так, то спутившись на уровень ниже, туда где нет ограничений, по идее получив данный адрес - мы можем сделать call по этому адресу. другое дело какой эффект получится, непонятно.
поэтому обращаюсь к тебе Evg как к очень опытному специалисту знающему "нутро".
вот мы сделали бинарник. в нем программа, в ней создаются объекты классов.
мне сложно судить где буду лежать эти объекты, предположу что в .text
если мое предположение верно, то после отображения в память, можно будет обратится к конструктору зная его адрес, поскольку никакие высокоуровневые вещи не будут мешать.

вопрос 2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A
{
public:
    int a;
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это временный объект и сразу после создания будет вызван деструктор
 
int mass [1000];
 
for(int i=0;i<1000;i++)//это вызовы для мебели и зачистки останков временных объектов
    mass[i] = i;
 
 
pa->~A(); //не вызывается. объекта нет НО
int z = pa->a; //дело его живет. z ==555
 
 
return 0;
};
каково время жизни поля класса после уничтожения объекта класса?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2012, 15:40
Ответы с готовыми решениями:

Взятие значение из адреса
Имеется код добавления объекта &quot;точка&quot; в массив точек: void arr_point::add_point(point &amp;p) { point *buf = new point;//Создаю...

Взятие адреса в аргументе
Есть такой код: void STOCK::acquiare(const std::string &amp;co,long n, double pr) { company=co; if (n&lt;0) { ...

Взятие адреса у константной переменной при объявлении
Можно пример?

69
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
18.02.2012, 19:06
Студворк — интернет-сервис помощи студентам
чей то файл не прикрепился посылаю еше раз
Вложения
Тип файла: rar tstOptimise.rar (3.2 Кб, 12 просмотров)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2012, 12:07
Вот пример на логическое время жизни:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int x = 1;
 
int main (void)
{
  /* В данной точке __локальная__ переменная "x" логически ещё не существует
   * (хотя компилятор память под неё уже выделил). Поэтому в данной точке
   * в качестве "x" подставится __глобальная__ переменная */
  int a = x;
 
  int x = 2;
 
  /* А в этой точке __локальная__ переменная "x" уже существует, и подставится
   * именно она */
  int b = x;
 
  printf ("a=%d, b=%d\n", a, b);
 
  return 0;
}
Code
1
2
3
$ gcc t.c
$ ./a.out
a=1, b=2
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
24.02.2012, 16:11  [ТС]
интерeсно

Добавлено через 1 минуту
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
и глобальные объекты не имеют "логической жизни"?

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
int z;
};
A a; //типа он логически не жилец?
int main ()
{
a.z = 5;
 
return 0;}

логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе. в данном случае по имени переменной.
Я правильно сформулировал?
Напиши плиз свою версию.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2012, 16:17
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
Не "по моему", а "по стандарту". И не с объявления в стеке, а с написания в исходнике.

Цитата Сообщение от AzaKendler Посмотреть сообщение
и глобальные объекты не имеют "логической жизни"?
У них время жизни "вся программа". Т.е. от начала исполнения main и до завершения работы программы

Цитата Сообщение от AzaKendler Посмотреть сообщение
логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе
Логическая жизнь - это то, что гарантирует стандарт. Что начиная с этой точки к переменной можно обращаться. Будь то с точки зрения языка (т.е. по имени), будь то с точки зрения исполняемого кода. Т.е. если до объявления локала ты воткнёшь ассемблерную вставку, которая будетработать с памятью, которую компилятор отвёл под локал, и если этот код не будет работать должным образом - то сам дурак, потому что компилятор (а точнее, стандарт) будет тебе гарантировать корректную работу с переменной только начиная с точки её объявления в исходнике.
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
24.02.2012, 16:23  [ТС]
Секция .data

Как по умолчанию программный код попадает в секцию .text, так и инициализированные данные попадают в секцию .data. Инициализированные данные состоят из тех глобальных и статических переменных, которые были проинициализированы во время компиляции. Они также включают строковые литералы (например, строку "Hello World" в программе C/C++). Компоновщик объединяет все секции .data из разных объектных и LIB-файлов в одну секцию .data в ЕХЕ-файле. Локальные переменные расположены в стеке цепочки и не занимают места в секциях .data и .bss.
абстрактная цитата

те переменные которые ты привел в примере они располагаются в разных точках просто.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Что начиная с этой точки к переменной можно обращаться.
в твоем примере к глобальной х можно обращаться. в моем к а тоже.
что не так с логической жизнью у них? поясни

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
/* В данной точке локальная переменная "x" логически ещё не существует
* ** (хотя компилятор память под неё уже выделил). *
*
}
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.02.2012, 16:44
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
Попробуйте.
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
24.02.2012, 16:52  [ТС]
невнимательно читал. речь шла о локальной переменной.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.02.2012, 16:54
AzaKendler, пример Evg был о другом. Глобальная переменная там была только для того, чтобы показать, что логически в коде "до" объявления локальной переменной её не существует, а существует глобальная, к которой и будет обращение. Вот минимальный код, который показывает то же, но тут не получится запутаться в локальных/глобальных именах.
C++
1
2
3
4
5
int main()
{
    x = 10;
    int x;
}
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
24.02.2012, 16:57  [ТС]
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
все верно. спутал с глобальной. невнимательно читал

Добавлено через 28 секунд
silent_1991, да я уже понял. слово локальная в его фразе как то "пропустил"

смешно получилось
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
24.02.2012, 17:00
Да, глобальная переменная была только для того, чтобы показать, что в первой точке локальной переменной x ещё не существует (в подверждение этого обращаясь к x, мы попадём именно к глобальной переменной). Это было сделано для того, чтобы получить пример, который компилируется и исполняется. Коротенький пример от silent_1991 показывает ровно то же самое, но в качестве подтверждения выступает ошибка компиляции
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2012, 17:00
Помогаю со студенческими работами здесь

Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Доброго времени суток. Очень часто наблюдаю во всевозможных примерах такого вида код: void* bits = (void*)&amp;(pixels); Таких...

Проверка URL адреса на существование
Доброго времени суток! Есть определенный цикл по перебору страниц сайта, цикл определяет некоторые недоступные страницы вследствие их...

Проверка email адреса на существование
Доброго времени суток. Есть надобность в небольшой программе. Суть в том что после ввода email адреса ей нужно проверить её существование. ...

Проверка на существование proxy адреса
Добрый день У меня такой вопрос Каким кодом я могу осуществить проверку на существование proxy адреса на работоспособность. Допустим...

Файлы: ввод адреса объекта и вывод данных объекта
Всем привет. Хочу сделать программу, в консоль которой, вводится адрес папки/файла, после чего, консоль выводит данные этого объекта. ...


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

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru