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

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

Восстановить пароль Регистрация
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:00     Указатели на объекты #1
В книге Шилдта, есть фрагмент кода:

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;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:09     Указатели на объекты #2
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]
Но даже, если это компилируется - код опасен. Конструируется временный объект, от него берется адрес (?), вызывается деструктор временного объект, указатель указывает на удаленный объект.
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
21.08.2012, 13:10     Указатели на объекты #3
ну вообще где еще могут хранится обьекты? - в памяти компьютера, в какой либо его ячейке.

ну, а не работает, потому что под 2 еще не резервировалась память, следовательно, указателю не на что ссылаться.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:21     Указатели на объекты #4
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 ]
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:24  [ТС]     Указатели на объекты #5
[QUOTE=ForEveR;3377397]bgm313, Это не тоже самое. А вы уверены что этот пример вообще работает? Нельзя взять адрес временного объекта.

Да уверен, но неужели Шилдт мог допустить такую оплошность?
Код взят из кнги C++ для начинающих в разделе наследование и виртуальные функции.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:26     Указатели на объекты #6
bgm313, Название книги и желательно страницу.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:39  [ТС]     Указатели на объекты #7
Г. Шилдт. C++. Руководство для начинающих. 2005 год. 669 стр. djvu. 18.1 Мб.
Страницы 509 - 513
Aloir
 Аватар для Aloir
216 / 216 / 13
Регистрация: 17.12.2010
Сообщений: 688
21.08.2012, 13:39     Указатели на объекты #8
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");
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:43     Указатели на объекты #9
Aloir, Тут идет взятие адреса от временной переменной.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:44  [ТС]     Указатели на объекты #10
Цитата Сообщение от Aloir Посмотреть сообщение
а почему он не должен работать?

если я правильно понял, тут идет заполнение массива новыми обьектами класса
Я не спорю, он работает. Но вопрос в том, где хранятся объекты, на которые ссылаются указатели из массива shapes. С моей точки зрения код не совсем корректен: создается временный объект и его адрес присваивается какому-то элементы массива shapes. Но далее это объект уничтожается или нет?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.08.2012, 13:45     Указатели на объекты #11
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:46  [ТС]     Указатели на объекты #12
Объект уничтожается, я проверил.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:46     Указатели на объекты #13
bgm313, Да, там именно так. Ну что ж. Просто знайте, что этот код некорректный, потому как взятие адреса от временной переменной ни к чему хорошему не приведет.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:48  [ТС]     Указатели на объекты #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
Согласен, но меня больше интересует почему Шилдт так накосячил?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 13:49     Указатели на объекты #15
bgm313, Ну потому что Шилдт все же пишет многое вразрез со стандартом. На уровне начинающих - на это внимание не заостряют.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 14:07  [ТС]     Указатели на объекты #16
А вот такой код является ли верным? Тут также, как и во всех предыдущих примерах создается временный объект или нет? Расскажите кто знает?

C++
1
2
//код внутр main
MyClass *ob = new MyClass(void);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2012, 14:08     Указатели на объекты
Еще ссылки по теме:

C++ Реализуйте алгоритм сортировки для массива, содержащего указатели на объекты-множества целых чисел
Указатели на объекты в массиве C++
C++ Указатели на объекты

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2012, 14:08     Указатели на объекты #17
bgm313, Является. Тут нету создания "временного" объекта. Объект создается не на стеке, а в динамической памяти, соответственно будет существовать, пока его не delete.
Yandex
Объявления
21.08.2012, 14:08     Указатели на объекты
Ответ Создать тему
Опции темы

Текущее время: 18:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru