Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
#1

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

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

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

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

Получить указатель из функции и использовать его в другой функции
Подскажите пожалуйста как из функции использовать в функции main указатель?...

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

Когда стоит использовать класс, а когда лучше обойтись без них?
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует...

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

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

Добавлено через 40 секунд
Спросишь зачем он нужен?
1
Андрейка
421 / 225 / 87
Регистрация: 25.03.2009
Сообщений: 744
15.01.2010, 22:33 #3
Лучший ответ Сообщение было отмечено как решение

Решение

Syltan, нужен для того чтобы в методе не возникало неопределенности когда поле класса и параметры метода имеют одиноковое имя . this -> x = x;
6
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:34 #4
Лучший ответ Сообщение было отмечено как решение

Решение

Данные у каждого объекта свои, а функции класса общие для всех объектов,
указатель this помогает, определить с данными какого объекта будет работать функция.
5
Syltan
240 / 8 / 7
Регистрация: 27.08.2009
Сообщений: 868
15.01.2010, 22:35  [ТС] #5
А пример можно, как и когда его использовать, а то не могу понять как на практике?
1
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 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
1241 / 779 / 108
Регистрация: 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
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,211
Завершенные тесты: 3
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
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
15.01.2010, 22:48 #9
Путём разадресации this можно получить ссылку на объект.
Пример: разадресации

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

Ссылка на объект используется как возвращаемое значение операции присваивания.
1
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,512
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
1241 / 779 / 108
Регистрация: 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
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,512
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 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:18 #13
Цитата Сообщение от insideone Посмотреть сообщение
data = new char[sizeof(*newData)];
ну и что ты хочешь этим сделать?
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
15.01.2010, 23:21 #14
не отсюда начинать вам нужно, молчеловек. вы бы еще спросили на форуме что такое переменная.
сперва книжку нужно в руки взять, попытаться прочесть и понять. если хорошая книжка непонятна, стоит подумать: а сюда ли мне вообще? может в другую дверь?
0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,512
15.01.2010, 23:22 #15
ну и что ты хочешь этим сделать?
Правда бред... ладно эту строчку можно вычеркнуть =\ просто у меня возникла какая то мысль о динамическом выделении памяти и руки сами написали, я в этом пока не разбираюсь к сожалению.
0
zim22
depict1
276 / 141 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:24 #16
novi4ok, молчеловек - это кто?
я?
insideone?
Genius Ignat?
Syltan?

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

Не по теме:

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

0
zim22
depict1
276 / 141 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.01.2010, 23:29 #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение
malloc отдыхает
...
причём здесь malloc?
0
15.01.2010, 23:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2010, 23:29
Привет! Вот еще темы с решениями:

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

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

Когда использовать WinAPI, а когда функции языка?
Не совсем понимаю, когда нужно использовать WinAPI в приложении, а когда...

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


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

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

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