Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.74
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

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

16.02.2012, 15:40. Просмотров 9115. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2012, 15:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос [C++] Взятие адреса конструктора. Физическое время существование объекта. (C++):

Почему лучше инициализировать объекты класса во время инициализации конструктора? - C++
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

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

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

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

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

[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу - C++
По заданию требуется: 1) Создать функцию void Insert(Person&amp; person, int index), помещающую переменную типа Person по указанному...

69
ValeryS
Модератор
7013 / 5351 / 528
Регистрация: 14.02.2011
Сообщений: 18,055
18.02.2012, 19:06 #61
чей то файл не прикрепился посылаю еше раз
0
Вложения
Тип файла: rar tstOptimise.rar (3.2 Кб, 11 просмотров)
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
24.02.2012, 12:07 #62
Вот пример на логическое время жизни:

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;
}
Код
$ gcc t.c
$ ./a.out
a=1, b=2
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:11  [ТС] #63
интер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
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
24.02.2012, 16:17 #64
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
Не "по моему", а "по стандарту". И не с объявления в стеке, а с написания в исходнике.

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

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

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

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

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

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

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

смешно получилось
0
Evg
Эксперт CАвтор FAQ
18913 / 6872 / 503
Регистрация: 30.03.2009
Сообщений: 19,348
Записей в блоге: 30
24.02.2012, 17:00 #70
Да, глобальная переменная была только для того, чтобы показать, что в первой точке локальной переменной x ещё не существует (в подверждение этого обращаясь к x, мы попадём именно к глобальной переменной). Это было сделано для того, чтобы получить пример, который компилируется и исполняется. Коротенький пример от silent_1991 показывает ровно то же самое, но в качестве подтверждения выступает ошибка компиляции
0
24.02.2012, 17:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2012, 17:00
Привет! Вот еще темы с ответами:

Существование объекта - C++
Здравствуйте, есть довольно сложное и интересное задание Есть класс someClass нужно сделать так чтобы: 1) Его объекты можно было...

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

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

Проверить существование объекта - C++ Qt
Есть QList&lt;QTcpSocket*&gt; _psocks. Все сокеты, которые попадают в этот список проходят через соединение: connect(psock,...


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

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Опции темы

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