Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель this 
:(
    Опции темы
murzzzzz
Дата 14.2.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



чо это вообще за указатель такой this? им кто-нить юзает? тогда с какой целью?
PM MAIL ICQ   Вверх
setq
Дата 14.2.2005, 12:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код
this
используется, для обращения к экземпляру класса из функции, определённой в этом классе.
Код
class A { public:
  int x;
  void f () { }
} m, n;
m и n будут иметь каждый свою копию переменной x. а вот функция f будет у них общая (так уж получается). чтобы f могла отличить m от n ей при вызове
Код
m . f ();
неявно передаётся указатель на m. функция может обратиться к нему по имени this. например так:
Код
#include <iostream.h>

class A { public:
  int x;
  void f () {
     cout << "адрес в памяти того экземпляра,"
                  " который меня вызвал: " << this << "\n";
  }
} m, n;
для чего это бывает надо? ну, как... зависит от фантазии. например определим функцию f класса A как
Код
#include <iostream.h>

class A { public:
  int x;
  A& f () {
     cout << "привет\n";
     return *this;
  }
} m, n;
теперь в программу вставим
Код
m.f ().f ().f ().f ();  // четыре раза привет :)
впрочем есть случаи когда можно спокойно обойтись и без this.
Код
#include <iostream.h>

class A { public:
  int x;
  void f () {
     cout << "моя переменная x = "  <<  this->x    << "\n";
     cout << "но можно написать и так = " <<  x << "\n";
  }
} m, n;
надеюсь я ничего не напутал в примерах. почти не пишу на c++

а вообще, не обижайся, советую почитать чего-нибудь. в с++ много интересного %)

Это сообщение отредактировал(а) setq - 14.2.2005, 12:36
  Вверх
murzzzzz
Дата 14.2.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



читала ,токо в книге в книге как в Библии, сильно замысловато:)), поэтому и спрашую.
а почему в коде
Код

#include <iostream.h>
class A { public:
  int x;
  A& f () {
     cout << "привет\n";
     return *this;
  }
} m, n;

када Вы функцию определяли, не написали какого она типа? или када используется
Код

A& f ()
{... }

не надо тип? это ж типа ссылка?
PM MAIL ICQ   Вверх
_hunter
Дата 14.2.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



это и есть тип smile -- ссылка


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
murzzzzz
Дата 14.2.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 13.2.2005
Где: Киев

Репутация: 1
Всего: 1



ага!!!!! поняла!!! smile
токо этот this мне все равно не нравится smile так все-таки, программеры!ответте мне плизззз!Вы юзаете этим указателем или нет?без него можна обойтись, не теряя при этом компактности, читабельности и всего того, чем должна быть обеспечена моднявая прога? smile
PM MAIL ICQ   Вверх
Wowa
Дата 14.2.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



не знаю, как this*, но сам this - конечно очень нужен.
PM WWW   Вверх
_hunter
Дата 14.2.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



самый простой и понятный пример:
у тебя членом класса является поле id и в конструктор тебе передается переменная с именем id
вот чтобы полю класса присвоить переданную переменную пишут this->id = id;


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Wowa
Дата 14.2.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



а когда все-таки нужен this* ?
Это ведь не обыкновенный указатель, а тут ключевое словое this используется, которой символизирует сам класс.
Или это также действует? пример?

Код

class a {
public:
id;

// Конструктор
a (id) {
this->id=id;
this* bb; //bb является указателем (пока еще в никуда) этого класса.
*bb=&id;

//Будут ли выведены на экран два одинаковых числа?
cout <<this->id<<;
cc=*bb;
cout <<*cc<<;

}

}

void main() {
id=3;
a aa = id; //Передаем конструктору id

return 0;
}

Добавлено @ 18:27
_hunter можешь исправить ошибки в моем коде?
PM WWW   Вверх
_hunter
Дата 14.2.2005, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



примерно так ( не вводя доп. операторов ( и если правильно понял идею ) ):

Код

class a
{
public:
   int id;
   a (int id)
   {
       this->id=id;
       a* bb;
       bb = this;
       bb->id = id;

       std::cout <<this->id;
       std::cout <<bb->id;
   }
};

int main(int argc, char* argv[])
{
   int id=3;
   a aa(id);
}


а *this нужен для сцепки ( как уже было показанно выше )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
pablo
Дата 14.2.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Указатель this очень часто используется для перегрузки операторов,
а именно там где нужна конкатенация.
Например оператор +.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
bel_nikita
Дата 14.2.2005, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Еще вот, такое использование this:
Код

class cExample
{
public:
 cExample(){};
 ~cExample(){};
 void SomeFunction(unsigned value)
 {
   if (!this) return; // если объект не создан выходим
   printf("\nSomeFunction =%d",value);
 }

protected:
private:
};

Код

cExample* pExample = NULL;

pExample->SomeFunction(0); // прога не вылетает;) и метод не вызывается :))

pExample = new cExample(); // создали объект
pExample->SomeFunction(1); // а теперь метод вызывается
delete pExample;



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Adil'
Дата 15.2.2005, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата(_hunter @ 14.2.2005, 18:39)
  a (int id)
  {
      this->id=id;
Обычно, чтобы не возникало путаницы, стараются в методе класса не давать параметрам имена, совпадающие с именами членов smile
Цитата(bel_nikita @ 14.2.2005, 21:44)
cExample* pExample = NULL;
  pExample->SomeFunction(0); // прога не вылетает;) и метод не вызывается smile)
  ...
метод все-таки вызывается, просто возврат из него происходит по if(!this) smile
З.Ы. Без проверки твой пример все равно будет работать smile
Цитата(bel_nikita @ 14.2.2005, 21:44)
...
  void SomeFunction(unsigned value)
{
  printf("\nSomeFunction =%d",value);
}
  ...
- в нем же нет обращения к this. Вот так наглядней:
Код
class cExample
{
public:
cExample(){};
~cExample(){};
void SomeFunction(unsigned value)
{
  if (!this) return; // если объект не создан выходим
  data=value;
  printf("\nSomeFunction =%d",data);
}

protected:
int data;
private:
};




--------------------
Удачи
PM MAIL WWW   Вверх
Да гость я...
Дата 16.2.2005, 09:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Э-э-эх ребя...
Хрен бы кто из вас у меня техническое интервью прошел.

Попросил бы вас написать оператор присваивания для к-нибудь простенького класса. Как вы его без this нарисуете?
Код

class A
{
   int n;
public:
// assignment operator
A& operator=(const A& rA)
{
   if(this != &rA)
       n = rA.n;

   return *this;
}

A& operator+(const A& rA)
{
   n += rA.n;

   return *this;
}
};


Зачем в опреаторе присвоения this спросите? Да чтобы объект сам в себя не копировать.
А зачем перегруженные операторы часто *this возвращают? Чтобы выражения с объектами можно было записывать в таком же виде, как и со встроенными типами. Например,

Код

int nB= xxx, nC= xx, nD= xxxx; // etc
int nA= nB + nC - nD + 10;

A cB, cC, cD; // предположим, что все объекты инициализированы

A cA= cB - cC + cD; // предположим, что все требуемые операторы для класса A определены


Ну, и наконец, signature любой ф-ции члена класса содержит this первым аргументом. Это единственный способ сообщить ей данные какого объекта она в настоящий момент должна обработать. Точка входа-то в код ф-ции-член класса одна, а объектов - куча. А иначе каким таким образом ф-ция знает, для данных какого объекта её вызвали? Без понимания этого обстоятельства у людей объектный код ф-ций-членов размножаться начинает...
  Вверх
Да гость я...
Дата 16.2.2005, 09:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Ну, и наконец, signature любой ф-ции члена класса содержит this первым аргументом

Сорри, неточность в формулировке: любой НЕСТАТИЧЕСКОЙ ф-ции члена класса. Статические методы this не получают. Именно поэтому они в состоянии доступиться только до статических же атрибутов.
Ну покедова...
  Вверх
Adil'
Дата 16.2.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 6
Всего: 15



Цитата
Э-э-эх ребя...
Хрен бы кто из вас у меня техническое интервью прошел.

Попросил бы вас написать оператор присваивания для к-нибудь простенького класса. Как вы его без this нарисуете?
Ты б и обычное у меня не прошел, бо как даже все мессаги прочесть поленился :
Цитата(pablo @ 14.2.2005, 19:09)
Указатель this очень часто используется для перегрузки операторов,
а именно там где нужна конкатенация.
Например оператор +.

Тоже мне, самый умный...


--------------------
Удачи
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.