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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 384, средняя оценка - 4.66
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

Указатель this - как и когда его использовать - C++

15.01.2010, 22:20. Просмотров 47303. Ответов 39
Метки нет (Все метки)

Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2010, 22:20     Указатель this - как и когда его использовать
Посмотрите здесь:

C++ Получить указатель из функции и использовать его в другой функции
C++ Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию?
Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
C++ указатель, как его перевести? с++
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
Зачем использовать Указатель на указатель? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:31     Указатель this - как и когда его использовать #2
Указатель this это константный указатель на объект.

Добавлено через 40 секунд
Спросишь зачем он нужен?
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
15.01.2010, 22:33     Указатель this - как и когда его использовать #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Syltan, нужен для того чтобы в методе не возникало неопределенности когда поле класса и параметры метода имеют одиноковое имя . this -> x = x;
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:34     Указатель this - как и когда его использовать #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Данные у каждого объекта свои, а функции класса общие для всех объектов,
указатель this помогает, определить с данными какого объекта будет работать функция.
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
15.01.2010, 22:35  [ТС]     Указатель this - как и когда его использовать #5
А пример можно, как и когда его использовать, а то не могу понять как на практике?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.01.2010, 22:38     Указатель this - как и когда его использовать #6
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Указатель this это константный указатель на объект.
Не верно. Указатель this является константным только в const методах.
Syltan, this является для объекта указателем на самого себя.
Для примера можно привести ситуацию когда одному из методов объекта необходимо вернуть указатель/ссылку на сам объект.
C++
1
2
3
4
5
6
7
8
class Foo{
public:
  Foo* GetThis()
  {
    // Возвращаем указатель на данный объект
    return this;
  }
};
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:42     Указатель this - как и когда его использовать #7
Пример к тому что сказал Андрейка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass{
 
int a;
public:
void set(int a);
 
};
 
void MyClass::set(int a){
this->a=a;      //полю класса присваиваются данные, определение кому присваивается.
 
 
}
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
15.01.2010, 22:46     Указатель this - как и когда его использовать #8
Например, нужно передать текущий объект в какую-нибудь функцию:
C++
1
2
3
4
5
6
7
8
void PlayerInfo::Realize(int project, PlayerInfo& player2)
{
...
// выполнить действие над собой и вторым игроком
// this - указатель на нас
pi.customAction(*this, player2);
...
}
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:48     Указатель this - как и когда его использовать #9
Путём разадресации this можно получить ссылку на объект.
Пример: разадресации

*this; //это уже есть обращение к адресу памяти, адрес которой хранит this.

Ссылка на объект используется как возвращаемое значение операции присваивания.
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
15.01.2010, 22:54     Указатель this - как и когда его использовать #10
C++
1
2
3
4
5
6
7
8
9
10
11
class int_stack{
  private:
  int stack[10];
  int count;
public:
  int_stack& operator << (int& newData);
}
void main(){
  int_stack S;
  S << 1 << 2 << 3; // будет ошибка если не возвращать перегрузкой int_stack&
}
Что должна вернуть перегрузка << ? Конечно себя. Это можно сделать только через return (*this);
Кроме того если вы по какой то причине назвали переменную внутри функции класса так же как какая то переменная класса - различить их поможет this) Только помоему это ошибка так делать, себя запутывать... Лучше называть переменные по виду newVar.
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 23:07     Указатель this - как и когда его использовать #11
insideone спасибо за развитие темы про ссылку *this:
Не решался написать, уж больно заготовка примера у меня сложная, не для новичков.
Может ты операцию присваивания напишешь.
Просто у меня пример с динамической памятью: сложно для новичков.

Добавлено через 7 минут
С помощью this в операции присваивания можно определить:
является присваиваемый объект, объектом которому присваивают
//короткий пример из некоторого кода
C++
1
2
3
4
5
const MyClass& MyClass:: operator = (const MyClass &p){
if(&p==this)return *this;     //объект нельзя присваивать самому себе.
 
return *this;
}
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
15.01.2010, 23:13     Указатель this - как и когда его использовать #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class qstring{
private:
    char* data;
    int Index;
public:
    qstring(char* newData){
        data = new char[sizeof(*newData)];
        data = newData;
    }
    qstring& operator[] (int newIndex){
        Index = newIndex;
    return (*this);
    }
    qstring& operator= (char newChar){
        data[Index] = newChar;
    return (*this);
    }
};
 
void main()
{   
    char x[12] = "Привет мир?";
    qstring QS(&x[0]);
    QS[10] = '!';
}
Чтобы после перегрузки [] дальше можно было использовать = так же как если бы мы писали просто "QS =" нужно возвращать (*this).
После последней строчки допишите "QS = '#';" будет изменен 10ый символ снова. Т.е. [] просто контролировало куда записывать, а возвращало себя для того чтобы можно было сократить код от
C++
1
2
QS[10];
QS = '!';
К более удобному приведенному выше.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:18     Указатель this - как и когда его использовать #13
Цитата Сообщение от insideone Посмотреть сообщение
data = new char[sizeof(*newData)];
ну и что ты хочешь этим сделать?
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
15.01.2010, 23:21     Указатель this - как и когда его использовать #14
не отсюда начинать вам нужно, молчеловек. вы бы еще спросили на форуме что такое переменная.
сперва книжку нужно в руки взять, попытаться прочесть и понять. если хорошая книжка непонятна, стоит подумать: а сюда ли мне вообще? может в другую дверь?
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
15.01.2010, 23:22     Указатель this - как и когда его использовать #15
ну и что ты хочешь этим сделать?
Правда бред... ладно эту строчку можно вычеркнуть =\ просто у меня возникла какая то мысль о динамическом выделении памяти и руки сами написали, я в этом пока не разбираюсь к сожалению.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:24     Указатель this - как и когда его использовать #16
novi4ok, молчеловек - это кто?
я?
insideone?
Genius Ignat?
Syltan?

Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 23:27     Указатель this - как и когда его использовать #17
Сообщение от insideone
data = new char[sizeof(*newData)];
malloc отдыхает
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 23:28     Указатель this - как и когда его использовать #18
insideone:
Может стоит подумать о Java
insideone
15.01.2010, 23:29
  #19

Не по теме:

Цитата Сообщение от Genius Ignat Посмотреть сообщение
malloc отдыхает
Это разве из C++ ?)
Может стоит подумать о Java
Может придумать свой язык программирования...?)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2010, 23:29     Указатель this - как и когда его использовать
Еще ссылки по теме:

Как использовать указатель на переменную во входящем параметре функции? C++
Когда использовать WinAPI, а когда функции языка? C++
О том, почему нелюбим goto; как его правильно использовать; и чем в моем случае его можно заменить? C++
Когда стоит использовать класс, а когда лучше обойтись без них? C++
Объяснить (с примерами) для чего нужен RTTI, как и когда его можно и нужно использовать C++

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

Или воспользуйтесь поиском по форуму:
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:29     Указатель this - как и когда его использовать #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение
malloc отдыхает
...
причём здесь malloc?
Yandex
Объявления
15.01.2010, 23:29     Указатель this - как и когда его использовать
Ответ Создать тему
Опции темы

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