Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

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

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

Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2010, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель this - как и когда его использовать (C++):

Тип void как возвращаемое значение функции: что он такое, зачем он нужен, где, когда и как его использовать? - C++
Объясните пожалуйста про Void для оооочень далекого человека. Читаю книгу Шилдта, в принципе всё ясно, всё понимаю и пробую, но вот Void -...

Объяснить (с примерами) для чего нужен RTTI, как и когда его можно и нужно использовать - C++
доброго времени суток. вопрос такой как я понял RTTI это свойсвто языка С++ которое было добавлено позднее его релиза, что бы...

Получить указатель из функции и использовать его в другой функции - C++
Подскажите пожалуйста как из функции использовать в функции main указатель? пример void foo1() {u=sizeof(str1); int *l=&u; } ...

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

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? - C++
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию? 2) правильно ли...

40
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:31 #2
Указатель this это константный указатель на объект.

Добавлено через 40 секунд
Спросишь зачем он нужен?
1
Андрейка
420 / 224 / 27
Регистрация: 25.03.2009
Сообщений: 744
15.01.2010, 22:33 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Syltan, нужен для того чтобы в методе не возникало неопределенности когда поле класса и параметры метода имеют одиноковое имя . this -> x = x;
6
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:34 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Данные у каждого объекта свои, а функции класса общие для всех объектов,
указатель this помогает, определить с данными какого объекта будет работать функция.
5
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
15.01.2010, 22:35  [ТС] #5
А пример можно, как и когда его использовать, а то не могу понять как на практике?
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.01.2010, 22:38 #6
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Указатель this это константный указатель на объект.
Не верно. Указатель this является константным только в const методах.
Syltan, this является для объекта указателем на самого себя.
Для примера можно привести ситуацию когда одному из методов объекта необходимо вернуть указатель/ссылку на сам объект.
C++
1
2
3
4
5
6
7
8
class Foo{
public:
  Foo* GetThis()
  {
    // Возвращаем указатель на данный объект
    return this;
  }
};
2
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:42 #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;      //полю класса присваиваются данные, определение кому присваивается.
 
 
}
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,200
Завершенные тесты: 1
15.01.2010, 22:46 #8
Например, нужно передать текущий объект в какую-нибудь функцию:
C++
1
2
3
4
5
6
7
8
void PlayerInfo::Realize(int project, PlayerInfo& player2)
{
...
// выполнить действие над собой и вторым игроком
// this - указатель на нас
pi.customAction(*this, player2);
...
}
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:48 #9
Путём разадресации this можно получить ссылку на объект.
Пример: разадресации

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

Ссылка на объект используется как возвращаемое значение операции присваивания.
1
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,480
15.01.2010, 22:54 #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.
3
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 23:07 #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;
}
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,480
15.01.2010, 23:13 #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 = '!';
К более удобному приведенному выше.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:18 #13
Цитата Сообщение от insideone Посмотреть сообщение
data = new char[sizeof(*newData)];
ну и что ты хочешь этим сделать?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
15.01.2010, 23:21 #14
не отсюда начинать вам нужно, молчеловек. вы бы еще спросили на форуме что такое переменная.
сперва книжку нужно в руки взять, попытаться прочесть и понять. если хорошая книжка непонятна, стоит подумать: а сюда ли мне вообще? может в другую дверь?
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,480
15.01.2010, 23:22 #15
ну и что ты хочешь этим сделать?
Правда бред... ладно эту строчку можно вычеркнуть =\ просто у меня возникла какая то мысль о динамическом выделении памяти и руки сами написали, я в этом пока не разбираюсь к сожалению.
0
15.01.2010, 23:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2010, 23:22
Привет! Вот еще темы с ответами:

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

Когда использовать WinAPI, а когда функции языка? - C++
Не совсем понимаю, когда нужно использовать WinAPI в приложении, а когда функционал самого ЯП (С/С++). Для той же работы с файлами...

Как использовать указатель на переменную во входящем параметре функции? - C++
Нашел код для решение гиперболического уравнение с помощью разностных схем. Возникли некоторые вопросы. Вот сам код: double...

Зачем использовать Указатель на указатель? - C++
Подскажите зачем использовать Указатель на указатель? И как работают двумерные массивы за счет указателей?


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

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

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