Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
#1

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

19.08.2014, 12:18. Просмотров 465. Ответов 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, которые расположены по разным адресам? Или значения хранятся по адресам самих объектов?

Спасибо!
http://www.cyberforum.ru/cpp-beginners/thread1076369.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2014, 12:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Где в приведенном коде переменные хранят свои значения (C++):

Не работает сортировка в приведенном коде
что тут не так? #include &lt;iostream&gt; using namespace std; void en(int*...

Исправить ошибки в приведенном коде
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Не правильно работает if в приведенном коде
Есть функция которая считает начало слова в строке(a - массив строк, b - массив...

Найти ошибку в приведенном коде
Windows выдает ошибку, почему ? #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Найти ошибку в приведенном коде
#include &lt;iostream&gt; using namespace std; ...

18
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:23 #2
По трём разным адресам, физически в оперативной памяти ПК.
0
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:26  [ТС] #3
Понятно что в оперативной памяти, имелся в виду вопрос - по адресам самих объектов (&a, &b, &c) или по другим адресам скопированных конструктором-копировщиком переменных itsX?
0
orange_fox
34 / 34 / 8
Регистрация: 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. Они расположены немного после адресов объектов, которым они принадлежат, т.к. адрес объекта - это адрес начала объекта
1
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:42  [ТС] #5
Спасибо, а возможно ли именно эти адреса itsX вывести на экран?
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:44 #6
Конечно возможно.
0
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:46  [ТС] #7
Подредактирую вопрос ) Как именно возможно эти адреса вывести на экран?
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:50 #8
Например, в методе GetX вернуть ссылку:
C++
1
int & GetX() { return itsX; }
и получить адрес:
C++
1
cout << &a.GetX() << endl;
1
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
19.08.2014, 12:55 #9
Можно вывести смещение itsX от начала объекта, только надо это поле сделать public.
C++
1
2
int Z::*pX = &Z::itsX;
std::cout << px;
Только в твоём примере, скорее всего, оно будет == 0, так как член в классе всего один.
1
marina2
Рожденная для битвы
272 / 50 / 10
Регистрация: 08.11.2009
Сообщений: 1,029
19.08.2014, 13:24 #10
John Prick, всегда 1, даже с новыми переменными
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
19.08.2014, 13:35 #11
marina2, новые переменные объявляйте раньше itsX. И поиграйтесь с различными типами, а не только int. Думаю, значения будут весьма разные. На счёт того, что 1, возможно. Например, размер пустого класса тоже 1 байт.
1
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2014, 13:39 #12
Цитата Сообщение от John Prick Посмотреть сообщение
Можно вывести смещение itsX от начала объекта, только надо это поле сделать public.
Ну, стандарт вроде бы не утверждает, что указатель на член класса - это смещение от начала объекта. Так что такой вывод может зависеть от реализации.
0
John Prick
831 / 764 / 256
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
19.08.2014, 13:45 #13
Mr.X, ну да, стандарт это не указывает, но, как пишут умные книги, что
Однако большинство компиляторов реализуют указатели на члены
данных как целое, содержащее количество членов, равное смещению плюс
один. (Смещение вычисляется таким образом, что 0 может представлять
нулевой указатель на член данных.) Смещение указывает, на сколько
байтов от начала объекта смещен конкретный член.
0
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 13:51  [ТС] #14
castaway, Попробовал, при выводе адреса с помощью ссылки возвращается адрес объекта "а", а не "скопированной" конструктором-копировщиком переменной itsX, т.е. получается то же что и при выводе cout << &a; в листинге.

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

orange_fox,
Цитата Сообщение от orange_fox Посмотреть сообщение
Грубо говоря, у вас три разных переменных itsX. Они расположены немного после адресов объектов, которым они принадлежат, т.к. адрес объекта - это адрес начала объекта
То есть адрес этой "скопированной" конструктором копировщиком по умолчанию переменной itsX должен отличаться от адреса самого объекта. Каким же образом можно именно этот адрес, который "расположен немного после адреса объекта" вывести на экран?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.08.2014, 13:53 #15
X0, Откуда у вас в половине постов взялся "конструктор-копировщик"? В вашем коде нет вызова конструктора копирования, просто создание РАЗНЫХ объектов класса.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.08.2014, 13:53 #16
Цитата Сообщение от X0 Посмотреть сообщение
То есть получается, что конструктор-копировщик, про создании каждого объекта, создает полную копию класса Z и переменной itsX и хранит значения передаваемые в объект в трех разных переменных itsX, которые расположены по разным адресам? Или значения хранятся по адресам самих объектов?
класс это код. код хранится в единственом экземляре в секции кода.
никакой "конструктор-копировщик" в приведенном коде нафиг не участвует.
itsX у каждого объекта свой и соответсвенно значения хранятся по адресам относительно самих объектов.
относительно - учитывая какое-либо смещение, выравнивание и т.д. и т.п.
1
X0
0 / 0 / 1
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 13:56  [ТС] #17
ForEveR, но ведь тот который "по умолчанию" запускается в любом случае при создании нового объекта?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.08.2014, 15:04 #18
X0, С чего? Запускается конструктор, а не конструктор копии.
1
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 15:22 #19
X0, значит переменная находится в самом начале объекта по адресу, именно поэтому они и совпадают. По моему всё логично.
1
19.08.2014, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2014, 15:22
Привет! Вот еще темы с решениями:

Найти ошибку в приведенном коде
void Print(int a) { cout &lt;&lt; &quot;int : &quot;&lt;&lt; a; } void Print (float b) { cout...

Что делает memset в приведенном коде
void replace(char* text, char* word) { char* buffer = new char;...

Найти и исправить ошибки в приведенном коде, C++
Помогите пожалуйста найти и исправить ошибки в приведенном коде. Код...

Найти и исправить ошибки в приведенном коде
//#include &lt;stdafx.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using...


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

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

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