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

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

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

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

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

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

Найти ошибку в приведенном коде - C++
Windows выдает ошибку, почему ? #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; using namespace std; class...

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

Найти ошибку в приведенном коде - C++
На самом деле тут две ошибки. Первое, ругается windows при запуске (есть комментарий на какую строку). Второе - не понимаю как сделать...

Исправить ошибки в приведенном коде - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { int...

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

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

18
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:23 #2
По трём разным адресам, физически в оперативной памяти ПК.
0
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:26  [ТС] #3
Понятно что в оперативной памяти, имелся в виду вопрос - по адресам самих объектов (&a, &b, &c) или по другим адресам скопированных конструктором-копировщиком переменных itsX?
0
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. Они расположены немного после адресов объектов, которым они принадлежат, т.к. адрес объекта - это адрес начала объекта
1
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:42  [ТС] #5
Спасибо, а возможно ли именно эти адреса itsX вывести на экран?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:44 #6
Конечно возможно.
0
X0
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
19.08.2014, 12:46  [ТС] #7
Подредактирую вопрос ) Как именно возможно эти адреса вывести на экран?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
19.08.2014, 12:50 #8
Например, в методе GetX вернуть ссылку:
C++
1
int & GetX() { return itsX; }
и получить адрес:
C++
1
cout << &a.GetX() << endl;
1
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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 / 5
Регистрация: 08.11.2009
Сообщений: 1,022
19.08.2014, 13:24 #10
John Prick, всегда 1, даже с новыми переменными
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
19.08.2014, 13:35 #11
marina2, новые переменные объявляйте раньше itsX. И поиграйтесь с различными типами, а не только int. Думаю, значения будут весьма разные. На счёт того, что 1, возможно. Например, размер пустого класса тоже 1 байт.
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2014, 13:39 #12
Цитата Сообщение от John Prick Посмотреть сообщение
Можно вывести смещение itsX от начала объекта, только надо это поле сделать public.
Ну, стандарт вроде бы не утверждает, что указатель на член класса - это смещение от начала объекта. Так что такой вывод может зависеть от реализации.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
19.08.2014, 13:45 #13
Mr.X, ну да, стандарт это не указывает, но, как пишут умные книги, что
Однако большинство компиляторов реализуют указатели на члены
данных как целое, содержащее количество членов, равное смещению плюс
один. (Смещение вычисляется таким образом, что 0 может представлять
нулевой указатель на член данных.) Смещение указывает, на сколько
байтов от начала объекта смещен конкретный член.
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 должен отличаться от адреса самого объекта. Каким же образом можно именно этот адрес, который "расположен немного после адреса объекта" вывести на экран?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
19.08.2014, 13:53 #15
X0, Откуда у вас в половине постов взялся "конструктор-копировщик"? В вашем коде нет вызова конструктора копирования, просто создание РАЗНЫХ объектов класса.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2014, 13:53
Привет! Вот еще темы с ответами:

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

Не выполняется код в цикле в приведенном коде - C++
Не могу понять, почему не выполняется код в цикле в этом коде: // sp_Ch5P255_Exercise05 /// Занятия по книге Стивена Праты &quot;Язык...

Найти и исправить ошибки в приведенном коде - C++
//#include &lt;stdafx.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; void main () { setlocale (LC_ALL,...

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
19.08.2014, 13:53
Ответ Создать тему
Опции темы

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