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

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

Войти
Регистрация
Восстановить пароль
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
21.08.2012, 13:10     Указатели на объекты #3
ну вообще где еще могут хранится обьекты? - в памяти компьютера, в какой либо его ячейке.

ну, а не работает, потому что под 2 еще не резервировалась память, следовательно, указателю не на что ссылаться.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
217 / 217 / 13
Регистрация: 17.12.2010
Сообщений: 689
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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
~ Эврика! ~
1243 / 992 / 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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
21.08.2012, 13:46     Указатели на объекты #13
bgm313, Да, там именно так. Ну что ж. Просто знайте, что этот код некорректный, потому как взятие адреса от временной переменной ни к чему хорошему не приведет.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
21.08.2012, 13:48  [ТС]     Указатели на объекты #14
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что то, что справа от & — это временные объекты. Они не сохраняются в памяти после завершения вычисления выражения. Поэтому если их адрес ваш компилятор и позволяет взять (всё же они где-то хранятся на время вычислений), то не факт, что там будет лежать та переменная, что вам нужна. Временные объекты уничтожаются после завершения полного выражения, так что то, что по тому адресу лежит в памяти — это уже формально не ваш объект и вообще память вам не принадлежит.
Согласен, но меня больше интересует почему Шилдт так накосячил?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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++
Движение закрашенного прямоугольника по треугольному контуру с изменением цвета при изменении направления движения. #include &lt;conio.h&gt;...

Классы и объекты - C++
Такая ситуация: есть кусочек кода, не несущего смысловой нагрузки. while(a &lt; b) а++; где a и b объекты самопального класса сверхбольших...

Классы и объекты на С++ - C++
Задание: Класс Triangle (треугольник). Класс хранит Декартовы координаты трех углов треугольника. Конструктор принимает три группы...

функции объекты - C++
Здорова! От есть код для подсчета суммы элементов в последовательности но почему то ноль выводится. #include &lt;iostream&gt; using...


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

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

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