Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0x0152
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210
1

Нулевой указатель на объект

24.04.2016, 15:39. Просмотров 964. Ответов 7
Метки нет (Все метки)

Здравствуйте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using std::cout;
using std::endl;
 
class A {
public:
    A() {}
    int Foo() { return 56; }
    A* This() { return this; }
};
 
int main() {
 
    A* a = nullptr;
    cout << "number: " << (*a).Foo() << endl;
    cout << "class: " << a->This() << endl;
 
    system("PAUSE");
    return 0;
}
Код
Вывод: 
number: 56 
class: 00000000
Объясните, откуда берется новый объект? и как это запретить?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2016, 15:39
Ответы с готовыми решениями:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это...

Основы: указатель на объект или объект, что выбрать?
Не до конца понимаю (или вообще не понимаю) когда лучше использовать указатель на объект, а когда...

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.

Нулевой указатель
Что происхот при: int* p = NULL; cout &lt;&lt; *p; Другими словами, на что ссылается нулевой...

Нулевой указатель
Всем привет. Возникли вот такие вопросы: Допустим, есть код: char *a = new char(5); В каких...

7
nmcf
6527 / 5751 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
24.04.2016, 15:51 2
Лучший ответ Сообщение было отмечено 0x0152 как решение

Решение

Ниоткуда он не берётся. Эти функции не зависят от объекта. Хотя, неожиданно.
1
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,002
24.04.2016, 16:00 3
C++
1
2
3
4
5
6
7
8
9
10
//A* a = nullptr;
    
A* a = new A;
    cout << "number: " << (*a).Foo() << endl;
    cout << "class: " << a->This() << endl;
    
 
delete a;
    system("PAUSE");
    return 0;
0
0x0152
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210
24.04.2016, 16:22  [ТС] 4
Цитата Сообщение от nmcf Посмотреть сообщение
Ниоткуда он не берётся. Эти функции не зависят от объекта. Хотя, неожиданно.
Спасибо. Почему-то сам с начало не сообразил.

Добавлено через 3 минуты
SergioO, Я спрашивал почему это работает, а не где у меня ошибка
0
24.04.2016, 16:22
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,002
24.04.2016, 18:32 5
Цитата Сообщение от 0x0152 Посмотреть сообщение
SergioO, Я спрашивал почему это работает, а не где у меня ошибка
потому что компилятор слишком умный... или наоборот тупой
0
0x0152
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210
24.04.2016, 18:49  [ТС] 6
Цитата Сообщение от SergioO Посмотреть сообщение
потому что компилятор слишком умный... или наоборот тупой
Компилятор все правильно сделал. Все методы класса хранятся как обычные функции. При создании объекта память выделяться лишь на данные. А при вызове метода происходит обращение к функции, которой первым параметром передается указатель на класс.
0
SergioO
169 / 185 / 90
Регистрация: 13.12.2015
Сообщений: 1,002
24.04.2016, 18:56 7
(*a).Foo()
это разве не "оптимизация" компилятора?
когда a==nullptr
0
0x0152
31 / 31 / 23
Регистрация: 23.03.2015
Сообщений: 210
24.04.2016, 19:45  [ТС] 8
Цитата Сообщение от SergioO Посмотреть сообщение
это разве не "оптимизация" компилятора?
когда a==nullptr
Т.к метод класса это обычная функция, поэтому вызов метода заменяется на call [адрес функции] в который передаться первым параметром указатель на класс(В данном случае нулевой указатель). Поэтому при вызове метода не важно что находиться в указателе. Обращение к данных происходит по смещению [адрес объекта ] + [смещение]. Указатель на объект нужен для доступа к данных. В классе нет членов(данных), поэтому переданные нулевой указатель нигде не используется.
Поэтому здесь ни какой оптимизации нет.
0
24.04.2016, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2016, 19:45

Указатель объект на объект (фикс ошибки)
/*Есть некий объект ObjectOne который содержит в private: такую строку*/ ObjectTwo *obj = new...

Нулевой указатель на функцию
Всем привет. Ещё раз подыму предыдущую тему. Я делаю упражнение на явное связывание dll. Проблема...

Как работает нулевой указатель?
Как загнать нулевой указатель на Пробовал вот так, например: {... char *REZ=STR(str2, str1);...


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

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

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