Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208

Указатели на объекты

21.08.2012, 13:00. Показов 1726. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книге Шилдта, есть фрагмент кода:

C++
1
2
3
4
5
6
7
TwoDShape *shapes[5];
    
    shapes[0] = &Triangle("pryamougolni",8.0,12.0);
    shapes[1] = &Rectangle(10);
    shapes[2] = &Rectangle(10,4);
    shapes[3] = &Triangle(7.0);
    shapes[4] = &TwoDShape(10,20,"general");
Вопрос:где хранятся сами объекты на которые, указывают указатели shapes?
Почему выше приведённый код работает, а вот этот нет (как-будто бы почти тоже самое):

C++
1
2
  int *p;
  p = &2;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2012, 13:00
Ответы с готовыми решениями:

Указатели на объекты
имеется класс Users и массив указателей на класс Users* userq у класса Users есть метод charsheet() и свойство Я вызываю...

Указатели на объекты
Здравствуйте! Есть класс, назовем его Some. Он содержит указатель на объект класса Other в качестве одной из переменных (свойств). В...

Указатели на объекты класса
Здравствуйте. помогите новичку. есть проблема с освоением программирования на VC++. пытаюсь скомпилировать вот этот пример из книги: ...

16
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:09
bgm313, Это не тоже самое. А вы уверены что этот пример вообще работает? Нельзя взять адрес временного объекта.

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
class C
{
};
 
int main()
{
   C* p = &C();
}
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp
new.cpp: В функции «int main()»:
new.cpp:9:14: ошибка: адрес от временной переменной [-fpermissive]
Но даже, если это компилируется - код опасен. Конструируется временный объект, от него берется адрес (?), вызывается деструктор временного объект, указатель указывает на удаленный объект.
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
21.08.2012, 13:10
ну вообще где еще могут хранится обьекты? - в памяти компьютера, в какой либо его ячейке.

ну, а не работает, потому что под 2 еще не резервировалась память, следовательно, указателю не на что ссылаться.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:21
5.3.1/3 драфт n3337

The result of the unary & operator is a pointer to its operand. The operand shall be an lvalue or a qualified-
id. If the operand is a qualified-id naming a non-static member m of some class C with type T, the result has
type “pointer to member of class C of type T” and is a prvalue designating C::m. Otherwise, if the type of
the expression is T, the result has type “pointer to T” and is a prvalue that is the address of the designated
object (1.7) or a pointer to the designated function. [ Note: In particular, the address of an object of type
“cv T” is “pointer to cv T”, with the same cv-qualification. — end note ] [ Example:
C++
1
2
3
struct A { int i; };
struct B : A { };
... &B::i ...
— end example ] [ Note: a pointer to member formed from a mutable non-static data member (7.1.1) does
not reflect the mutable specifier associated with the non-static data member. — end note ]
1
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:24  [ТС]
[QUOTE=ForEveR;3377397]bgm313, Это не тоже самое. А вы уверены что этот пример вообще работает? Нельзя взять адрес временного объекта.

Да уверен, но неужели Шилдт мог допустить такую оплошность?
Код взят из кнги C++ для начинающих в разделе наследование и виртуальные функции.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:26
bgm313, Название книги и желательно страницу.
0
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:39  [ТС]
Г. Шилдт. C++. Руководство для начинающих. 2005 год. 669 стр. djvu. 18.1 Мб.
Страницы 509 - 513
0
 Аватар для Aloir
225 / 225 / 38
Регистрация: 17.12.2010
Сообщений: 713
21.08.2012, 13:39
C++
1
2
3
4
5
6
7
TwoDShape *shapes[5];
    
    shapes[0] = &Triangle("pryamougolni",8.0,12.0);
    shapes[1] = &Rectangle(10);
    shapes[2] = &Rectangle(10,4);
    shapes[3] = &Triangle(7.0);
    shapes[4] = &TwoDShape(10,20,"general");
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:43
Aloir, Тут идет взятие адреса от временной переменной.
0
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:44  [ТС]
Цитата Сообщение от Aloir Посмотреть сообщение
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
Я не спорю, он работает. Но вопрос в том, где хранятся объекты, на которые ссылаются указатели из массива shapes. С моей точки зрения код не совсем корректен: создается временный объект и его адрес присваивается какому-то элементы массива shapes. Но далее это объект уничтожается или нет?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
21.08.2012, 13:45
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
1
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:46  [ТС]
Объект уничтожается, я проверил.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:46
bgm313, Да, там именно так. Ну что ж. Просто знайте, что этот код некорректный, потому как взятие адреса от временной переменной ни к чему хорошему не приведет.
1
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:48  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
Согласен, но меня больше интересует почему Шилдт так накосячил?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 13:49
bgm313, Ну потому что Шилдт все же пишет многое вразрез со стандартом. На уровне начинающих - на это внимание не заостряют.
0
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 14:07  [ТС]
А вот такой код является ли верным? Тут также, как и во всех предыдущих примерах создается временный объект или нет? Расскажите кто знает?

C++
1
2
//код внутр main
MyClass *ob = new MyClass(void);
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2012, 14:08
bgm313, Является. Тут нету создания "временного" объекта. Объект создается не на стеке, а в динамической памяти, соответственно будет существовать, пока его не delete.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2012, 14:08
Помогаю со студенческими работами здесь

Указатели на объекты в массиве
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; /////////////////////////////////////////////////////////// class person...

Указатели на константные объекты
Нельзя создать неконстантный указатель на константный объект по понятным причинам, но имеем такой код: typedef char* pStr; int...

Создать указатели и ссылки на объекты в памяти
Помогите, кто может Создайте в свободной памяти три объекта различных типов (Cat, Worker, Pencil…). Замените указатели ссылками и...

Как в методах первого класса использовать указатели на объекты второго и наоборот?
Помогите решить проблемку. Сложилась такая ситуация: Файл class1.h: #ifndef H_CLASS1 #define H_CLASS1 #include...

Контейнер <vector> содержащий указатели на объекты не выдает количество элементов методом size()
Neuron FirstNeuron; Dendrite ZeroDendrite; Dendrite FirstDendrite; Dendrite SecondDendrite; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru