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

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

Войти
Регистрация
Восстановить пароль
 
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
#1

Где в приведенном коде переменные хранят свои значения - C++

19.08.2014, 12:18. Просмотров 394. Ответов 18
Метки нет (Все метки)

Друзья, помогите разобраться с объектами. Например, где, созданные в этом листинге 3 объекта - а, b и с, после инициализации с помощью конструктора по умолчанию, физически хранят свои значения?

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
26
27
28
29
#include <iostream>
#include <conio.h>
using namespace std;
 
class Z
{
 
public:
    int GetX() {return itsX;}
    void SetX(int x) {itsX = x;}
    
private:
    int itsX;
    
};
 
int main()
{
    Z a, b, c;
    a.SetX(1);
    b.SetX(2);
    c.SetX(3);
 
    cout << a.GetX() << " " << b.GetX() << " " << c.GetX()  << " " << endl;
    cout << &a << " " << &b << " " << &c  << " " << endl;
 
    _getch();
    return 0;
}

То есть получается, что конструктор-копировщик, про создании каждого объекта, создает полную копию класса Z и переменной itsX и хранит значения передаваемые в объект в трех разных переменных itsX, которые расположены по разным адресам? Или значения хранятся по адресам самих объектов?

Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:23     Где в приведенном коде переменные хранят свои значения #2
По трём разным адресам, физически в оперативной памяти ПК.
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:26  [ТС]     Где в приведенном коде переменные хранят свои значения #3
Понятно что в оперативной памяти, имелся в виду вопрос - по адресам самих объектов (&a, &b, &c) или по другим адресам скопированных конструктором-копировщиком переменных itsX?
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
19.08.2014, 12:31     Где в приведенном коде переменные хранят свои значения #4
Цитата Сообщение от X0 Посмотреть сообщение
Например, где, созданные в этом листинге 3 объекта - а, b и с, после инициализации с помощью конструктора по умолчанию, физически хранят свои значения?
В оперативной памяти.

То есть получается, что конструктор-копировщик, про создании каждого объекта, создает полную копию класса Z и переменной itsX и хранит значения передаваемые в объект в трех разных переменных itsX, которые расположены по разным адресам?
Конструктор копирования вы не создали. Он остался по умолчанию. Конструктор копирования выглядит примерно так:
C++
1
2
3
4
class Test
{
Test(const Test&);
};
Каждый экземпляр(объект) класса кранит свои нестатические члены-данные в разных местах, и они не зависят друг от друга. Грубо говоря, у вас три разных переменных itsX. Они расположены немного после адресов объектов, которым они принадлежат, т.к. адрес объекта - это адрес начала объекта
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:42  [ТС]     Где в приведенном коде переменные хранят свои значения #5
Спасибо, а возможно ли именно эти адреса itsX вывести на экран?
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:44     Где в приведенном коде переменные хранят свои значения #6
Конечно возможно.
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:46  [ТС]     Где в приведенном коде переменные хранят свои значения #7
Подредактирую вопрос ) Как именно возможно эти адреса вывести на экран?
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:50     Где в приведенном коде переменные хранят свои значения #8
Например, в методе GetX вернуть ссылку:
C++
1
int & GetX() { return itsX; }
и получить адрес:
C++
1
cout << &a.GetX() << endl;
John Prick
765 / 698 / 128
Регистрация: 27.07.2012
Сообщений: 1,997
Завершенные тесты: 3
19.08.2014, 12:55     Где в приведенном коде переменные хранят свои значения #9
Можно вывести смещение itsX от начала объекта, только надо это поле сделать public.
C++
1
2
int Z::*pX = &Z::itsX;
std::cout << px;
Только в твоём примере, скорее всего, оно будет == 0, так как член в классе всего один.
marina2
Рожденная для битвы
271 / 49 / 5
Регистрация: 08.11.2009
Сообщений: 1,019
19.08.2014, 13:24     Где в приведенном коде переменные хранят свои значения #10
John Prick, всегда 1, даже с новыми переменными
John Prick
765 / 698 / 128
Регистрация: 27.07.2012
Сообщений: 1,997
Завершенные тесты: 3
19.08.2014, 13:35     Где в приведенном коде переменные хранят свои значения #11
marina2, новые переменные объявляйте раньше itsX. И поиграйтесь с различными типами, а не только int. Думаю, значения будут весьма разные. На счёт того, что 1, возможно. Например, размер пустого класса тоже 1 байт.
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2014, 13:39     Где в приведенном коде переменные хранят свои значения #12
Цитата Сообщение от John Prick Посмотреть сообщение
Можно вывести смещение itsX от начала объекта, только надо это поле сделать public.
Ну, стандарт вроде бы не утверждает, что указатель на член класса - это смещение от начала объекта. Так что такой вывод может зависеть от реализации.
John Prick
765 / 698 / 128
Регистрация: 27.07.2012
Сообщений: 1,997
Завершенные тесты: 3
19.08.2014, 13:45     Где в приведенном коде переменные хранят свои значения #13
Mr.X, ну да, стандарт это не указывает, но, как пишут умные книги, что
Однако большинство компиляторов реализуют указатели на члены
данных как целое, содержащее количество членов, равное смещению плюс
один. (Смещение вычисляется таким образом, что 0 может представлять
нулевой указатель на член данных.) Смещение указывает, на сколько
байтов от начала объекта смещен конкретный член.
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 13:51  [ТС]     Где в приведенном коде переменные хранят свои значения #14
castaway, Попробовал, при выводе адреса с помощью ссылки возвращается адрес объекта "а", а не "скопированной" конструктором-копировщиком переменной itsX, т.е. получается то же что и при выводе cout << &a; в листинге.

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

orange_fox,
Цитата Сообщение от orange_fox Посмотреть сообщение
Грубо говоря, у вас три разных переменных itsX. Они расположены немного после адресов объектов, которым они принадлежат, т.к. адрес объекта - это адрес начала объекта
То есть адрес этой "скопированной" конструктором копировщиком по умолчанию переменной itsX должен отличаться от адреса самого объекта. Каким же образом можно именно этот адрес, который "расположен немного после адреса объекта" вывести на экран?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.08.2014, 13:53     Где в приведенном коде переменные хранят свои значения #15
X0, Откуда у вас в половине постов взялся "конструктор-копировщик"? В вашем коде нет вызова конструктора копирования, просто создание РАЗНЫХ объектов класса.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.08.2014, 13:53     Где в приведенном коде переменные хранят свои значения #16
Цитата Сообщение от X0 Посмотреть сообщение
То есть получается, что конструктор-копировщик, про создании каждого объекта, создает полную копию класса Z и переменной itsX и хранит значения передаваемые в объект в трех разных переменных itsX, которые расположены по разным адресам? Или значения хранятся по адресам самих объектов?
класс это код. код хранится в единственом экземляре в секции кода.
никакой "конструктор-копировщик" в приведенном коде нафиг не участвует.
itsX у каждого объекта свой и соответсвенно значения хранятся по адресам относительно самих объектов.
относительно - учитывая какое-либо смещение, выравнивание и т.д. и т.п.
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 13:56  [ТС]     Где в приведенном коде переменные хранят свои значения #17
ForEveR, но ведь тот который "по умолчанию" запускается в любом случае при создании нового объекта?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.08.2014, 15:04     Где в приведенном коде переменные хранят свои значения #18
X0, С чего? Запускается конструктор, а не конструктор копии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2014, 15:22     Где в приведенном коде переменные хранят свои значения
Еще ссылки по теме:

C++ Какие ошибки содержатся в приведенном коде?
Найти ошибку в приведенном коде C++
Найти и исправить ошибки в приведенном коде C++
Найти ошибку в приведенном коде C++
Запуск деструктора не осуществляется в приведенном коде C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4879 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 15:22     Где в приведенном коде переменные хранят свои значения #19
X0, значит переменная находится в самом начале объекта по адресу, именно поэтому они и совпадают. По моему всё логично.
Yandex
Объявления
19.08.2014, 15:22     Где в приведенном коде переменные хранят свои значения
Ответ Создать тему
Опции темы

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