Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
#1

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

21.08.2012, 13:00. Просмотров 965. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 13:00
Ответы с готовыми решениями:

Указатели на объекты
имеется класс Users и массив указателей на класс Users* userq у класса Users...

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

Указатели на константные объекты
Нельзя создать неконстантный указатель на константный объект по понятным...

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

Указатели на объекты в массиве
#include <iostream> #include <string> using namespace std;...

16
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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]
Но даже, если это компилируется - код опасен. Конструируется временный объект, от него берется адрес (?), вызывается деструктор временного объект, указатель указывает на удаленный объект.
0
Aloir
219 / 219 / 38
Регистрация: 17.12.2010
Сообщений: 710
21.08.2012, 13:10 #3
ну вообще где еще могут хранится обьекты? - в памяти компьютера, в какой либо его ячейке.

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

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

если я правильно понял, тут идет заполнение массива новыми обьектами класса
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 13:43 #9
Aloir, Тут идет взятие адреса от временной переменной.
0
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:44  [ТС] #10
Цитата Сообщение от Aloir Посмотреть сообщение
а почему он не должен работать?

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

C++
1
2
//код внутр main
MyClass *ob = new MyClass(void);
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.08.2012, 14:08 #17
bgm313, Является. Тут нету создания "временного" объекта. Объект создается не на стеке, а в динамической памяти, соответственно будет существовать, пока его не delete.
1
21.08.2012, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2012, 14:08

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

Реализуйте алгоритм сортировки для массива, содержащего указатели на объекты-множества целых чисел
Помогите сделать лабу, Я даже не знаю с чего начинать. Пользователь...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс...


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

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

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